Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - GeniusZ

Страницы: [1] 2
1
Общие вопросы / Re: Помощь с CLEO
« : Август 02, 2017, 01:48:45 pm »
Код: Text
  1. {$CLEO .cs}
  2.  
  3. //-------------MAIN---------------
  4. 0000: NOP
  5. :1    
  6. wait 0    
  7. if    
  8.  05EE: key_pressed 71
  9. jf @1      
  10. :2          
  11.  wait 30    
  12. if    
  13.  85EE: not key_pressed 71
  14. jf @2
  15. 04C4: store_coords_to 1@ 2@ 3@ from_actor $PLAYER_ACTOR with_offset 60.0 60.0 0.0
  16. 04C4: store_coords_to 4@ 5@ 6@ from_actor $PLAYER_ACTOR with_offset -60.0 -60.0 0.0
  17. 053E: 10@ = get_random_car_with_actors -1 in_area 1@ 2@ 4@ 5@
  18. //jf @1 - не правильно закомментировали
  19. 02D4: car 10@ turn_off_engine 0    
  20. jump @1  

2
Общие вопросы / Re: Помощь с CLEO
« : Июль 31, 2017, 08:39:31 pm »
Вся память программы состоит из кода и данных, и, чтобы программа случайно не натворила что-нибудь с кодом, на него устанавливается защита. Чтобы ее снять, надо писать virtual_protect 1(когда мы, конечно, модифицируем код и знаем что делаем).

Скажите, пожалуйста, есть такой опкод, который записывает  ближайшую машину в переменную.
053E: $Car = get_random_car_with_actors -1 in_area $2556 $2658 $445 $446

3
Общие вопросы / Re: Помощь с CLEO
« : Июль 30, 2017, 05:50:17 am »
В данном случае 0x2B0 означает смещение от структуры машины. То есть, чтобы получить адрес состояния фар определенной машины, нужно получить ее структуру и прибавить к ней это смещение.
Цитировать
0x2B0   byte   light status
•   bit 0/1 = front left lights
•   bit 2/3 = front right lights
•   bit 4/5 = rear left lights
•   bit 6/7 = rear right lights
Судя по этому описанию, это поле структуры в 1 байт, и оно является флагом фар. Я имею в виду, что каждый бит этого байта отвечает за свет каждой фары транспортного средства.
Код: Text
  1. {$CLEO}
  2. 0000:
  3.  
  4. while true //начало бесконечного цикла
  5.     wait 0 //задержка, чтобы игра обработала кадр
  6.    
  7.     if and //если игрок за рулем и нажал клавишу "H"
  8.         Actor.Driving($PLAYER_ACTOR)
  9.         05EE: key_pressed 0x48 // key "H"
  10.     then //тогда
  11.         03C0: 0@ = actor $PLAYER_ACTOR car //находим машину, в которой сидит игрок
  12.         05E7: 0@ = car 0@ struct //получаем структуру этой машины
  13.         0@ += 0x2B0 //прибавляем смещение
  14.         05E0: 1@ = read_memory 0@ size 1 virtual_protect 0 //считыванием состоянием флагов
  15.        
  16.         if //если фары выключены
  17.             1@ == 0
  18.         then //тогда устанавливаем все флаги
  19.             1@ = 0xFF //в двоичном представление это число выглядит так: 11111111
  20.         else //иначе сбрасываем все флаги
  21.             1@ = 0 //в двоичном представление это число выглядит так: 00000000
  22.         end //конец проверки
  23.        
  24.         05DF: write_memory 0@ size 1 value 1@ virtual_protect 0 //записываем получившиеся значение обратно
  25.         wait 250 //маленькая задержка, чтобы фары не переключались мгновенно
  26.     end  //конец первой проверки
  27.    
  28. end //конец бесконечного цикла

4
Общие вопросы / Re: Помощь с CLEO
« : Июль 23, 2017, 08:24:20 am »
Судя по коду, Вы декомпилируете свой же скрипт. Это делать не стоит, когда у вас есть исходники. Просто открываете .txt файл с кодом и продолжаете работать, иначе при декомпиляции вы теряете часть информации и получаете плохочитабельный код.

Что касается маркера на карте, то используйте вместо опкода:
02A7: 13@ = create_icon_marker_and_sphere 31 at -1107.25 -517.35 11.20вот эти:
0570: 13@ = create_asset_radar_marker_with_icon 31 at -1107.25 -517.35 11.20
03BC: 14@ = create_sphere -1107.25 -517.35 11.20

Только потом не забудьте выключить сферу:
...
:car_tuning_3
0164: disable_marker 13@
03BD: destroy_sphere 14@

Что касается условий: зачем проверять каждое условие отдельно, если можно проверить все разом?
{$CLEO}

0570: 13@ = create_asset_radar_marker_with_icon 31 at -1107.25 -517.35 11.20
03BC: 14@ = create_sphere -1107.25 -517.35 11.20 2.0

:car_tuning_1
wait 0
if and
  0256:   player $PLAYER_CHAR defined
  00E0:   player $PLAYER_CHAR driving
  00F5:   player $player_char in_sphere 0 near_point -1107.25 -517.35 11.20 radius 30.0 30.0 30.0
  0103:   actor $PLAYER_ACTOR stopped_near_point_in_car -1107.25 -517.35 11.20 radius 3.0 3.0 3.0 sphere 0 // never used in VC
  0122:   player $PLAYER_CHAR pressing_horn
  010A:   player $PLAYER_CHAR money > 10000
jf @car_tuning_1
0109: player $PLAYER_CHAR money += -10000
016A: fade 0 1000 ms
0001: wait 1500 ms 
03C0: 0@ = actor $PLAYER_ACTOR car
053F: set_car 0@ tires_vulnerable 0
016A: fade 1 1000 ms
0001: wait 1500 ms
0394: play_music 1
0164: disable_marker 13@
03BD: destroy_sphere 14@
05DC: end_custom_thread

Вообще я мог бы рекомендовать вам сайт ru-script.3dn.ru. Правда там уроки скриптинга по SA, но он мало чем отличается от скриптинга в VC.

5
Общие вопросы / Re: Помощь с CLEO
« : Июль 17, 2017, 06:59:31 am »
Вопрос чем разница между ими?.
0214: pickup 3@ picked_up
И
pickup.Picked_up
В санни билдере есть такие полезные штуки как кейворды и классы. Они дают возможность не запоминать номера опкодов, а использовать ключевые слова. Например, вместо 0001: wait 0 ms можно написать wait 0, pickup.Picked_up вместо 0214: pickup 3@ picked_up. Классы содержат кейворды объединенные одним объектом (Actor, Car, Object, Model, Camera, Pickup).     

6
Флуд / Re: Флудильная
« : Июль 04, 2017, 05:44:46 am »
Такие крутые вещи делаете. Хочу тоже. Я смотрел ваши уроки, скачивал студию, пытался в диззасемблирование, но чет как-то с разбегу в сапсан не залез.
С чего начать? При условии, что могу нормально говнокодить в вебе (php, js). Что-то для самых маленьких.
В технаре был курс архитектуры эвм и там был типа ассемблер урезаный чтоб лампочки включать. Его осилил, а вот этот, ваш, чет я не вкурил.
С разбегу конечно не получится. Тут нужны практика, опыт, желание и время. Ну и конечно литературу читать по ассемблеру и ЯП.

7
Общие вопросы / Re: Помощь с CLEO
« : Июль 03, 2017, 07:18:30 am »
Вы неправильно затемняете экран и не ставите задержки, чтобы игрока не телепортировало бесконечно:

...
fade 0 1000
wait 1000
0055: put_player $PLAYER_CHAR at  -555.26 787.57 97.51   
fade 1 1000
wait 1000
...
fade 0 1000
wait 1000
0055: put_player $PLAYER_CHAR at -559.85 782.59 22.88       
fade 1 1000
wait 1000
...

8
Моды / Re: CarRec
« : Июль 02, 2017, 02:45:00 pm »
Конечно есть. Можно написать dll, которая внедряет процедуру поворота костей и содержит функции, через которые можно манипулировать этой процедурой через CLEO. Или можно написать ассемблерную вставку и внедрить ее в нужное место.

9
Моды / Re: CarRec
« : Июль 02, 2017, 07:55:14 am »
Дело в том, что скрипты обрабатываются раньше, чем анимация. Из-за этого игра переписывает значения кости анимацией.

10
Моды / Re: CarRec
« : Июнь 29, 2017, 06:39:08 pm »
Код: C++
  1. unsigned int* ClumpOffset = (unsigned int*)0x978798;

11
Моды / Re: CarRec
« : Июнь 28, 2017, 06:46:08 am »
...а потом кватернионы по смещению 0x02?
Функции я найду в базе, но немного не понятно происходящее в коде.
Не совсем.  Потом нужно сместиться по такой траектории:
Код: C++
  1. return (CBone *)(*(int *)(*(int *)((int)ped->m_pRwObject + *Game::ClumpOffset) + 0x10) + bone * 0x18);
Где bone это уже не номер кости, который мы передали в функцию, а результат этого присваивания:
Код: C++
  1. bone = RpHAnimIDGetIndex(Game::GetAnimHierarchyFromSkinClump(ped->m_pRwObject), bone);

Это мы нашли CBone. Дальше, чтобы добраться до квартерниона кости, нужно сместиться так CBone->AnimFrame.Quat, а до смещения - CBone->AnimFrame.Pos.

12
Моды / Re: CarRec
« : Июнь 27, 2017, 07:25:51 pm »
Спасибо, будет от чего отталкиваться. А про углы поворота костей(чтение и запись) случаем что-нибудь знаешь? Как ты реализовал в "First Person View" повороты рук при "выглядывании из окна" автомобиля?
Дело в том, что чтение/запись поворота костей было бы в сотни раз лучше, чем работать с анимациями. Можно было бы запилить эпичнейшие вещи...

Код: C++
  1. #pragma pack(push, 1)
  2. struct gtaHAnimIFrame
  3. {
  4.         int unk0;
  5.         int unk1;
  6.         RtQuat Quat;
  7.         RwV3d Pos;
  8. };
  9. #pragma pack(pop)
  10.  
  11. #pragma pack(push, 1)
  12. struct CBone
  13. {
  14.         unsigned int m_bFlags;
  15.         RwV3d m_vOffset;
  16.         gtaHAnimIFrame *AnimFrame;
  17.         unsigned int m_dwNodeId;
  18. };
  19. #pragma pack(pop)
  20.  
  21. CBone *GetPedBone(CPed *ped, DWORD bone)
  22. {
  23.         bone = RpHAnimIDGetIndex(Game::GetAnimHierarchyFromSkinClump(ped->m_pRwObject), bone);
  24.         return (CBone *)(*(int *)(*(int *)((int)ped->m_pRwObject + *Game::ClumpOffset) + 0x10) + bone * 0x18);
  25. }
Вращать по квартерниону из поля Quat структуры gtaHAnimIFrame.

13
Моды / Re: CarRec
« : Июнь 25, 2017, 01:15:03 pm »
Хотел сделать еще PedRec(или ActRec - для актеров, короче), но не знаю, как "прочитать" текущую анимацию, которую "играет" актер.

Как-то раз пришлось побороться с этой проблемой:
Код: C++
  1. bool ReadAnim(RwObject* Clump, char *string)
  2. {
  3.         unsigned int* ClumpOffset = (unsigned int*)0x978798;
  4.         char* animation = (char*)(*(int*)((**(int**)((int)((int*)Clump) + *ClumpOffset)) + 0x10));
  5.  
  6.         if (!strcmp(string, animation))
  7.                 return true;
  8.         else
  9.                 return false;
  10. }
Простите за говнокод, когда писал эту функцию был неопытен. И еще она недоработанная, так как читает только одну анимацию из анимаций, проигрываемых педом в данный момент.

14
Скриптинг / Re: Dubstep-пушка
« : Май 20, 2017, 03:21:12 pm »
По сути, скриптинг нужен для описания внутриигровых событий. Для более глобальных изменений необходимо использовать программирование.

15
Хм, еще бы найти указатель на weapon struct.
Если нужно перезарядить оружие игрока, тогда:
1)Получаем структуру педа игрока.
2)Смещаемся по структуре на 0x504 и высчитываем из полученного адреса значение размером в 1 байт (это номер активного слота оружия).
3)Затем снова от начала структуры смещаемся на 0x408 и прибавляем произведение номера слота на 0x18.
4)Получившиеся значение и есть адрес структуры CWeapon, который надо передать опкоду 05E3.

Страницы: [1] 2