Доброго дня.
Итак, сегодня речь пойдет о контроле нанесенного игроку урона. 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, табуляция



Сообщений: 57
Регистрация: 