Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 12

Тема: SIS - Simple Injury System, или Система ранений с нуля. Обучение работы с OnPlayerTakeDamage.

  1. #1
    ex-Pawn developer Аватар для SHOROOP
    Регистрация
    28.05.2011
    Адрес
    St.Petersburg
    Возраст
    32
    Сообщений
    2,667
    Репутация: 306

    Звание: как роза среди колючек

    SIS - Simple Injury System, или Система ранений с нуля. Обучение работы с OnPlayerTakeDamage.

    Доброго дня.

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

    Разбирать, как же все это работает, я предлагаю на конкретном примере. И примером таким станет написание системы нанесения ранений.

    Собственно, в обобщенном виде алгоритм действий будет таков:
    • Если игрок получает урон - с шансом 1 к 2 он упадет в обморок.
    • Если игрок падает в обморок - заморозить его любым доступным способом на определенное время. В примере время обморока будет выбрано случайно.
    • Если время обморока закончилось - разморозить игрока.

    Итак, приступим. Подключаем библиотеку a_samp. Работы в других коллбэках нам практически не нужны. Для собственной страховки в OnPlayerSpawn можно вызвать функцию ClearAnimations.

    Итак, первоначально - определяем время и шанс обморока. Минимальное время в моем примере - 15 секунд, максимальное - 1 минута.
    PHP код:
    public OnPlayerTakeDamage(playeridissueridFloatamountweaponid)
    {
    new 
    ObmorokTime random(45)+15;
    new 
    Obmorok random (3); 
    И в этом месте на момент написания скрипта я задумался. Есть шанс, что нанесенного урона хватит, чтобы убить игрока, однако для него уже будет вызвана анимация, что может привести к отсутствию вызова OnPlayerDeath. Проблема решилась просто и изящно - если у игрока будет менее 10 HP, скрипт просто не будет вызван. Точно также анимация будет вызвана и для водителя, что нам не нужно - такую проверку мы тоже поставим.
    PHP код:
    new Float:HP;
    GetPlayerHealth(playeridHP);
    if (
    HP >=10 && GetPlayerState(playerid) == PLAYER_STATE_ONFOOT)

    Далее через switch проверяем, упал все-таки в обморок игрок или нет. Если упал - очищаем ему текущую анимацию, на время ObmorokTime применяем к нему анимацию, которая не позволит игроку двигаться, и таймер для сброса этой анимации в указанное время.
    PHP код:
    switch (Obmorok)
    {
    case 
    2:
    {
    ClearAnimations(playerid);
    ApplyAnimation(playerid"CRACK""crckdeth2"4.10111ObmorokTime*10001);
    SetTimerEx ("ClearAnimation"ObmorokTime*1000false"d"playerid); 
    Ну, и для большей информативности - добавим информацию ранившему и раненному. Если же раненный сам виноват - следует ввести проверку и на это. Резервируем три переменные, проверяем ID атаковавшего и в зависимости от этого выводим сообщения о ранении.
    PHP код:
    new string[128], victim[MAX_PLAYER_NAME], attacker[MAX_PLAYER_NAME];
    GetPlayerName(playeridvictimsizeof (victim));
    if (
    issuerid != INVALID_PLAYER_ID)
    {
    GetPlayerName(issueridattackersizeof (attacker));
    format(stringsizeof(string), "%s ранил Вас!"attacker);
    SendClientMessage(playerid0xFF110000string);
    format(stringsizeof(string), "Вы ранили %s!"victim);
    SendClientMessage(issuerid0xFF110000string);
    }
    else
    {
    SendClientMessage(playerid0xFF110000"Вы ранены!");
    }
    }
    }
    }
    return 
    1;

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

    PHP код:
    #include <a_samp>

    public OnFilterScriptInit()
    {
    print(
    "\n--------------------------------------");
    print(
    "Обморок от ранения");
    print(
    "--------------------------------------\n");
    return 
    1;
    }

    public 
    OnFilterScriptExit()
    {
    return 
    1;
    }

    public 
    OnPlayerSpawn (playerid)
    {
    ClearAnimations(playerid);
    return 
    1;
    }

    public 
    OnPlayerTakeDamage(playeridissueridFloatamountweaponid)
    {
    new 
    ObmorokTime random(45)+15;
    new 
    Obmorok random (3);
    new 
    Float:HP;
    GetPlayerHealth(playeridHP);
    if (
    HP >=10 && GetPlayerState(playerid) == PLAYER_STATE_ONFOOT)
    {
    switch (
    Obmorok)
    {
    case 
    2:
    {
    ClearAnimations(playerid);
    ApplyAnimation(playerid"CRACK""crckdeth2"4.10111ObmorokTime*10001);
    SetTimerEx ("ClearAnimation"ObmorokTime*1000false"d"playerid);
    new 
    string[128], victim[MAX_PLAYER_NAME], attacker[MAX_PLAYER_NAME];
    GetPlayerName(playeridvictimsizeof (victim));
    if (
    issuerid != INVALID_PLAYER_ID)
    {
    GetPlayerName(issueridattackersizeof (attacker));
    format(stringsizeof(string), "%s ранил Вас!"attacker);
    SendClientMessage(playerid0xFF110000string);
    format(stringsizeof(string), "Вы ранили %s!"victim);
    SendClientMessage(issuerid0xFF110000string);
    }
    else
    {
    SendClientMessage(playerid0xFF110000"Вы ранены!");
    }
    }
    }
    }
    return 
    1;



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

  2. #2
    Активный пользователь Аватар для LMapper
    Регистрация
    01.04.2011
    Адрес
    != true
    Сообщений
    991
    Репутация: 91

    Звание: скоро придёт к известности

    Re: SIS - Simple Injury System, или Система ранений с нуля. Обучение работы с OnPlayerTakeDamage.

    Бред. Это не система ранений с нуля.
    Это система падения/попадения игрока в обморок.
    И кто автор ?
    Pawn,Sourcepawn,ArmA.
    Delphi,Pascal,etc..
    Досье:
    ...У ДЦ были проблемы с электроснабжением, никак не связанные с тем, что я играю в лол....
    С уважением,
    Команда Ru-hoster
    Психически не устойчив, на таблетках.

  3. #3
    ex-Pawn developer Аватар для SHOROOP
    Регистрация
    28.05.2011
    Адрес
    St.Petersburg
    Возраст
    32
    Сообщений
    2,667
    Репутация: 306

    Звание: как роза среди колючек

    Re: SIS - Simple Injury System, или Система ранений с нуля. Обучение работы с OnPlayerTakeDamage.

    Цитата Сообщение от LMapper Посмотреть сообщение
    Бред. Это не система ранений с нуля.
    Это система падения/попадения игрока в обморок.
    И кто автор ?
    Ну, может, название подобрано не совсем корректно - суть не в этом. Тутор нацелен на обучение работы с OnPlayerTakeDamage.

    В смысле "Кто автор"? Мопед мой, как говорится.

  4. #4
    Активный пользователь Аватар для LMapper
    Регистрация
    01.04.2011
    Адрес
    != true
    Сообщений
    991
    Репутация: 91

    Звание: скоро придёт к известности

    Re: SIS - Simple Injury System, или Система ранений с нуля. Обучение работы с OnPlayerTakeDamage.

    Цитата Сообщение от SHOROOP Посмотреть сообщение
    В смысле "Кто автор"? Мопед мой, как говорится.
    Значит надо написать, что-бы небыло сюрпризов, если статья пойдет по порталам.
    Pawn,Sourcepawn,ArmA.
    Delphi,Pascal,etc..
    Досье:
    ...У ДЦ были проблемы с электроснабжением, никак не связанные с тем, что я играю в лол....
    С уважением,
    Команда Ru-hoster
    Психически не устойчив, на таблетках.

  5. #5
    Проверенный Аватар для Engineer:
    Регистрация
    20.09.2011
    Адрес
    Украина.
    Возраст
    32
    Сообщений
    1,319
    Репутация: 180

    Звание: - весьма и весьма положительная личность

    Re: SIS - Simple Injury System, или Система ранений с нуля. Обучение работы с OnPlayerTakeDamage.

    Шуруп как всегда красавчик. Точно и ясно.

  6. #6
    ex-Pawn developer Аватар для SHOROOP
    Регистрация
    28.05.2011
    Адрес
    St.Petersburg
    Возраст
    32
    Сообщений
    2,667
    Репутация: 306

    Звание: как роза среди колючек

    Re: SIS - Simple Injury System, или Система ранений с нуля. Обучение работы с OnPlayerTakeDamage.

    Цитата Сообщение от LMapper Посмотреть сообщение
    Значит надо написать, что-бы небыло сюрпризов, если статья пойдет по порталам.
    На г-и и еще парочке ресурсов я сабжевый урок уже запостил. Последним постился здесь - уровень у наших, имхо, повыше, но мало ли - может, пригодится кому.

  7. #7
    Активный пользователь Аватар для NeiTraL
    Регистрация
    20.05.2012
    Адрес
    Россия / Уфа
    Возраст
    27
    Сообщений
    297
    Репутация: 0

    Звание: пока не определено

    Re: SIS - Simple Injury System, или Система ранений с нуля. Обучение работы с OnPlayerTakeDamage.

    Случайно если я стреляться буду, никакого флуда не будет в чат? типа:
    Допустим я стрельнул М4 раз десять и мне раза три, не будет вот так:

    %s ранил Вас!
    Вы ранили %s!
    Вы ранили %s!
    Вы ранили %s!
    %s ранил Вас!
    Вы ранили %s!
    Вы ранили %s!
    Вы ранили %s!
    %s ранил Вас!
    Вы ранили %s!
    Вы ранили %s!
    Вы ранили %s!
    Вы ранили %s! ??
    Skype: rineview
    Vkontakte: zzneitrallzz
    Mode: TvxCPG, Drift-Life 3.6 EXTRA, Fired-RP
    ServerIP: -
    Works: [GM] Drift-Life 3.3 GOLD
    [GM] Dm N•P•N•M
    [GM] League War v0.0.1
    [GM] Fired-RP
    [FS] Register System (mxINI *)
    [MAP] База Gang Wars
    [GM] Russian Twix
    [GM] T/CW League v1.9
    [CMD] /banall
    [Tutorial] Anti Spawn Kill
    [FS] Антиддос (Фейк Коннектер и Дедаваня)
    [FS] GodMode on nickname
    Status: Занят.

  8. #8
    Проверенный Аватар для Engineer:
    Регистрация
    20.09.2011
    Адрес
    Украина.
    Возраст
    32
    Сообщений
    1,319
    Репутация: 180

    Звание: - весьма и весьма положительная личность

    Re: SIS - Simple Injury System, или Система ранений с нуля. Обучение работы с OnPlayerTakeDamage.

    Цитата Сообщение от NeiTraL Посмотреть сообщение
    Случайно если я стреляться буду, никакого флуда не будет в чат? типа:
    Допустим я стрельнул М4 раз десять и мне раза три, не будет вот так:
    Написали же что просто для информативности.

  9. #9
    Активный пользователь
    Регистрация
    06.07.2011
    Сообщений
    472
    Репутация: 85

    Звание: скоро придёт к известности

    Re: SIS - Simple Injury System, или Система ранений с нуля. Обучение работы с OnPlayerTakeDamage.

    not bad...

  10. #10
    Ich liebe Deutschland Аватар для Фора
    Регистрация
    19.07.2010
    Сообщений
    3,615
    Репутация: 284

    Звание: как роза среди колючек

    Re: SIS - Simple Injury System, или Система ранений с нуля. Обучение работы с OnPlayerTakeDamage.

    Блять, ну *****. А табуляцию буду я делать? Да иди ты на! А так, отличный урок.

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. [Tutorial] Обучение маппингу
    от Арес в разделе Вопросы по маппингу
    Ответов: 72
    Последнее сообщение: 09.08.2015, 00:01
  2. Долбаный OnPlayerTakeDamage
    от Mikeyfry в разделе Вопросы по скриптингу
    Ответов: 15
    Последнее сообщение: 08.10.2013, 18:22
  3. Обучение pawno
    от Царь в разделе Беседка
    Ответов: 13
    Последнее сообщение: 08.07.2013, 08:39

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •