Сайт восстановлен из веб архива. Сейчас он доступен только для чтения, скачивание материалов также недоступно. Если у вас до сих пор есть какие-то вопросы по разработке серверов CRMP, вы можете перейти на актуальный портал: https://pawno-rus.com

Перейти к содержимому

Уважаемый гость, если у Вас возникли проблемы с регистрацией, просьба обратиться на почту admin@pawno-crmp.ru
Для полного доступа ко всем функциям, Вам необходимо зарегистрироваться и авторизоваться.
На нашем форуме, можно заказать рекламу в виде блока справа.


Фотография
Урок

Система ранений (обучение работы с OnPlayerTakeDamage)

- - - - -

  • Авторизуйтесь для ответа в теме
В этой теме нет ответов

#1
offline   SHOROOP

SHOROOP
  • 95
    • Сообщений: 57
    • Регистрация: 30.01.14
Доброго дня.
 
Итак, сегодня речь пойдет о контроле нанесенного игроку урона. SA:MP (а значит - и адаптации) при получении игроком урона незамедлительно запускает коллбэк OnPlayerTakeDamage, у которого есть несколько входных параметров:
  • playerid - ID игрока, которому был нанесен урон.
  • issuerid - ID игрока, который нанес урон. Если игрок пострадал от падения, взрыва и т.п. - в данный параметр будет передано значение INVALID_PLAYER_ID.
  • amount - количество нанесенного урона в виде числа с плавающей точкой.
  • weaponid - ID оружия, которым был нанесен урон, либо ID причины нанесения урона. Более подробно об этом можно прочитать в статье на

    Пожалуйста войдите или зарегистрируйтесь чтобы увидить ссылку.

    .
Разбирать, как же все это работает, я предлагаю на конкретном примере. И примером таким станет написание системы нанесения ранений.
 
Собственно, в обобщенном виде алгоритм действий будет таков:
  • Если игрок получает урон - с шансом 1 к 2 он упадет в обморок.
  • Если игрок падает в обморок - заморозить его любым доступным способом на определенное время. В примере время обморока будет выбрано случайно.
  • Если время обморока закончилось - разморозить игрока.
 
Итак, приступим. Подключаем библиотеку a_samp. Работы в других коллбэках нам практически не нужны. Для собственной страховки в OnPlayerSpawn можно вызвать функцию ClearAnimations.
 
Итак, первоначально - определяем время и шанс обморока. Минимальное время в моем примере - 15 секунд, максимальное - 1 минута.

Пожалуйста войдите или зарегистрируйтесь чтобы увидить ссылку.

И в этом месте на момент написания скрипта я задумался. Есть шанс, что нанесенного урона хватит, чтобы убить игрока, однако для него уже будет вызвана анимация, что может привести к отсутствию вызова OnPlayerDeath. Проблема решилась просто и изящно - если у игрока будет менее 10 HP, скрипт просто не будет вызван. Точно также анимация будет вызвана и для водителя, что нам не нужно - такую проверку мы тоже поставим.

Пожалуйста войдите или зарегистрируйтесь чтобы увидить ссылку.

Далее через switch проверяем, упал все-таки в обморок игрок или нет. Если упал - очищаем ему текущую анимацию, на время ObmorokTime применяем к нему анимацию и таймер для сброса этой анимации в указанное время.

Пожалуйста войдите или зарегистрируйтесь чтобы увидить ссылку.

Ну, и для большей информативности - добавим информацию ранившему и раненному. Если же раненный сам виноват - следует ввести проверку и на это. Резервируем три переменные, проверяем ID атаковавшего и в зависимости от этого выводим сообщения о ранении.

Пожалуйста войдите или зарегистрируйтесь чтобы увидить ссылку.

За этим все! Больше от программиста не требуется ничего, скрипт будет успешно работать, что уже доказано использованием его на нашем проекте уже больше года.
 
Полный код в виде ФС:

Пожалуйста войдите или зарегистрируйтесь чтобы увидить ссылку.

 
К сожалению, табуляция при постинге съехала, поэтому если нужно - табулируйте сами.
Вопросы принимаются в этой теме.

Сообщение отредактировал Vlad_Trifonov: 16 Август 2016 - 21:20
bb code, табуляция

  • 5



Темы с аналогичным тегами Урок

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных


Данную тему посетили 172 пользователей