Вопросы по созданию КЛЕО-скриптов
|
|
walk | Дата: Среда, 05.01.2011, 14:58 | Сообщение # 451 |
Группа: Проверенные
Сообщений: 96
Статус: Offline
| Code 0A96: $ActorStruct = actor $PLAYER_ACTOR struct $ActorStruct += +0x544 05E0: 0@ = read_memory $ActorStruct size 4 virtual_protect 0 Помоему так Обратно вернуть по: Code 0A96: $ActorStruct = actor $PLAYER_ACTOR struct $ActorStruct += +0x544 05DF: write_memory $ActorStruct size 4 value 100 virtual_protect 0 Добавлено (05.01.2011, 14:58) ---------------------------------------------
Quote (Den_spb) CPed +0x544 = [float] Максимальное здоровье Почему тут float?
Сообщение отредактировал walk - Среда, 05.01.2011, 14:57 |
|
| |
Den_spb | Дата: Среда, 05.01.2011, 15:39 | Сообщение # 452 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Quote (d88) И как отсюда узнать макс. Здоровье? К началу структуры надо прибавить смещение (в данном случае 0x544) - в результате получим адрес, по которому записано значение максимального здоровья данного педа. Для чтения значения, записанного по определённому адресу, применяется опкод 0A8D, а для перезаписи значения - 0A8C. Получается так:Code 0A96: 1@ = actor 0@ struct 1@ += 0x544 0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0 if 2@ <> 101.0 // проверяем значение максимального здоровья (отмечен ли пед) then // действия над неотмеченным педом 0A8C: write_memory 1@ size 4 value 101.0 virtual_protect 0 // отмечаем педа (вместо 101.0 можно взять другое значение) end ... 0A96: 1@ = actor 0@ struct 1@ += 0x544 0A8C: write_memory 1@ size 4 value 100.0 virtual_protect 0 // снимаем отметку с педа (выставляем другое значение макс. здоровья) Quote (d88) У всех должно быть разное макс. здоровье. Обычным педам можно выставлять одно значение, а актёрам, созданным скриптом - другое. Проверить, создан ли актёр скриптом, или это обычный пед, можно, прочитав значение флага уникальности ($ActorStruct += 0x484 Флаг уникальности. Значения: 2 - флаг есть (актёр создан скриптом), 1 - флага нет. Размер адреса: 1 байт)Проверил в игре макс. здоровье педов - у всех педов оно имеет значение 100.0 (используются дробные числа)
|
|
| |
walk | Дата: Среда, 05.01.2011, 15:56 | Сообщение # 453 |
Группа: Проверенные
Сообщений: 96
Статус: Offline
| Quote (Den_spb) Проверил в игре макс. здоровье педов - у всех педов оно имеет значение 100.0 (используются дробные числа) Ну тогда и выставлять надо дробное или нет разницы? И судя с этого и здоровье педа в игре тоже float?
|
|
| |
Den_spb | Дата: Среда, 05.01.2011, 16:01 | Сообщение # 454 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Quote (walk) Ну тогда и выставлять надо дробное или нет разницы? Выставлять надо как дробное. Иначе при восприятии игрой целого значения как дробного, пед может моментально стать нежизнеспособным (или наоборот, бессмертным). Quote (walk) И судя с этого и здоровье педа в игре тоже float? Да.
|
|
| |
walk | Дата: Среда, 05.01.2011, 16:06 | Сообщение # 455 |
Группа: Проверенные
Сообщений: 96
Статус: Offline
| Тогда и его желательно ставить дробным?Добавлено (05.01.2011, 16:06) --------------------------------------------- И ещё вопрос, а можно как-нибудь замерить максимальную скорость на отрезке пути? В принципе я всё смогу сам рассчитать, но вот как мне замерить отрезок пути (расстояние от точки до точки пройденное машиной)?
|
|
| |
Den_spb | Дата: Среда, 05.01.2011, 16:31 | Сообщение # 456 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Quote (walk) Тогда и его желательно ставить дробным? Да. Quote (walk) И ещё вопрос, а можно как-нибудь замерить максимальную скорость на отрезке пути? В принципе я всё смогу сам рассчитать, но вот как мне замерить отрезок пути (расстояние от точки до точки пройденное машиной)? Code while true car.StorePos(0@ 1@ 2@ 3@) 32@ = 0 wait 0 car.StorePos(0@ 4@ 5@ 6@) 050A: 1@ = distance_between_XYZ 1@ 2@ 3@ and_XYZ 4@ 5@ 6@ 32@ /= 1000 0093: 2@ = integer 32@ to_float 0073: 1@ /= 2@ // (float) получается скорость в м/с end
|
|
| |
d88 | Дата: Среда, 05.01.2011, 16:49 | Сообщение # 457 |
Группа: Проверенные
Сообщений: 113
Статус: Offline
| Den_spb, спасибо, но мне это всё равно кажется неправильных. Потому что надо делать проверку 2@ <> 101.0, а если актёр создан скриптом, то это значение может получится другое. Я ведь правильно понял, что 101 получается путём прибавления 1 к макс. значению? Quote (Den_spb) Обычным педам можно выставлять одно значение, а актёрам, созданным скриптом - другое. Проверить, создан ли актёр скриптом, или это обычный пед, можно, прочитав значение флага уникальности ($ActorStruct += 0x484 Флаг уникальности. Значения: 2 - флаг есть (актёр создан скриптом), 1 - флага нет. Размер адреса: 1 байт) Но так ведь нельзя узнать какое должно быть макс. здоровье. Оно в начале могло быть 200, 300 или 500…
|
|
| |
DK22Pac | Дата: Среда, 05.01.2011, 16:54 | Сообщение # 458 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Quote 101 получается путём прибавления 1 к макс. значению? Нет. Просто записывается 101.0.
|
|
| |
Den_spb | Дата: Среда, 05.01.2011, 17:01 | Сообщение # 459 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Quote (d88) Но так ведь нельзя узнать какое должно быть макс. здоровье. Оно в начале могло быть 200, 300 или 500… Если ты его не менял, то оно должно быть равно 100.
|
|
| |
walk | Дата: Среда, 05.01.2011, 17:11 | Сообщение # 460 |
Группа: Проверенные
Сообщений: 96
Статус: Offline
| Quote (Den_spb) while true car.StorePos(0@ 1@ 2@ 3@) 32@ = 0 wait 0 car.StorePos(0@ 4@ 5@ 6@) 050A: 1@ = distance_between_XYZ 1@ 2@ 3@ and_XYZ 4@ 5@ 6@ 32@ /= 1000 0093: 2@ = integer 32@ to_float 0073: 1@ /= 2@ // (float) получается скорость в м/с end Получается так я получу наивысшую скорость в этом промежутке пути? З.Ы. А зачем ты делил на 1000?
|
|
| |
Den_spb | Дата: Среда, 05.01.2011, 17:26 | Сообщение # 461 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Quote (walk) Получается так я получу наивысшую скорость в этом промежутке пути? При делении пройденного расстояния на время получается средняя скорость. Quote (walk) А зачем ты делил на 1000? Потому что значение таймера в миллисекундах. П.С.Почему не хочешь применить стандартный опкод получения значения скорости 02E3?
|
|
| |
walk | Дата: Среда, 05.01.2011, 17:51 | Сообщение # 462 |
Группа: Проверенные
Сообщений: 96
Статус: Offline
| Quote (Den_spb) П.С.Почему не хочешь применить стандартный опкод получения значения скорости 02E3? Мне легче будет способом, который предложил ты
|
|
| |
DK22Pac | Дата: Среда, 05.01.2011, 18:01 | Сообщение # 463 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Den_spb, кстати, таймер 33@ - это же не таймер "с обратным отсчётом". (Это сообщение не относится к предыдущим постам))
|
|
| |
walk | Дата: Среда, 05.01.2011, 18:09 | Сообщение # 464 |
Группа: Проверенные
Сообщений: 96
Статус: Offline
| Den_spb, чёрт, только щас допёрло, действительно, переменные 32 и 33 как-то с таймерами связанны
|
|
| |
Den_spb | Дата: Среда, 05.01.2011, 18:25 | Сообщение # 465 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Quote (DK22Pac) Den_spb, кстати, таймер 33@ - это же не таймер "с обратным отсчётом". 32@ и 33@ - таймеры с прямым отсчётом (их значения увеличиваются).
|
|
| |