Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 11
  1. #1
    Аватар для Albert
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.12.2014
    Сообщений
    109
    Репутация:
    0 ±

    Как создать зону с действием?

    Как создать зону входя в которую происходит определённое действие? К примеру отнимается HP.
    Создаю мод "S.T.A.L.K.E.R." и хочу создать простые радиоактивные зоны проходя по которым выводится игроку сообщение о том что он попал в такую зону и у него отнимается HP.
    Последний раз редактировалось Albert; 24.12.2014 в 19:44.

  2. #2
    Аватар для I'm Cobra
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.10.2013
    Сообщений
    151
    Репутация:
    17 ±
    Цитата Сообщение от Albert Посмотреть сообщение
    Как создать зону входя в которую происходит определённое действие? К примеру отнимается HP.
    Создаю мод "S.T.A.L.K.E.R." и хочу создать простые радиоактивные зоны проходя по которым выводится игроку сообщение о том что он попал в такую зону и у него отнимается HP.
    В паблик с посекундным обновлением:

    PHP код:
    if(IsPlayerInRangeOfPoint(playeridрадиускоординаты XYZ центральной точки))
    {
        
    SetPlayerHealth(playerid, -кол-во хп.0); // например: SetPlayerHealth(playerid, -25.0);
        
    SendClientMessage(playerid0xFFFFFFFF"* Вы в радиоактивной зоне!");

    Если у вас нет такого паблика добавьте в public OnGameModeInit строку:

    PHP код:
    SetTimer("UpdateOneSecond"10001); 
    В конец мода вставляете:
    PHP код:
    forward UpdateOneSecond(playerid);
    public 
    UpdateOneSecond(playerid)
    {
        if(
    IsPlayerInRangeOfPoint(playeridрадиус.0координаты XYZ центральной точки))
        {
            
    SetPlayerHealth(playerid, -кол-во хп.0); // например: SetPlayerHealth(playerid, -25.0);
            
    SendClientMessage(playerid0xFFFFFFFF"* Вы в радиоактивной зоне!");
        }

    То есть у игрока каждую секунду будет отниматься 25 хп.
    Последний раз редактировалось I'm Cobra; 24.12.2014 в 20:10.

  3. Пользователь сказал cпасибо:
    Albert (29.12.2014)
  4. #3
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Цитата Сообщение от I'm Cobra Посмотреть сообщение
    В паблик с посекундным обновлением:

    PHP код:
    if(IsPlayerInRangeOfPoint(playeridрадиускоординаты XYZ центральной точки))
    {
        
    SetPlayerHealth(playerid, -кол-во хп.0); // например: SetPlayerHealth(playerid, -25.0);
        
    SendClientMessage(playerid0xFFFFFFFF"* Вы в радиоактивной зоне!");

    Если у вас нет такого паблика добавьте в public OnGameModeInit строку:

    PHP код:
    SetTimer("UpdateOneSecond"10001); 
    В конец мода вставляете:
    PHP код:
    forward UpdateOneSecond(playerid);
    public 
    UpdateOneSecond(playerid)
    {
        if(
    IsPlayerInRangeOfPoint(playeridрадиус.0координаты XYZ центральной точки))
        {
            
    SetPlayerHealth(playerid, -кол-во хп.0); // например: SetPlayerHealth(playerid, -25.0);
            
    SendClientMessage(playerid0xFFFFFFFF"* Вы в радиоактивной зоне!");
        }

    То есть у игрока каждую секунду будет отниматься 25 хп.
    Фига-се, односекундный таймер в OnGameModeInit, Вы не ошиблись?
    Для отдельного игрока

  5. Пользователь сказал cпасибо:
    Albert (29.12.2014)
  6. #4
    Аватар для Albert
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.12.2014
    Сообщений
    109
    Репутация:
    0 ±
    спасибо. однако думаю что ежесекундное обновление сильно нагрузит сервер. может сделать на 5 секунд или на 10. ведь я думаю сделать штук 50 таких зон разной велечины. может по другому можно мою задумку реализовать?

  7. #5
    Аватар для L0ndl3m
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±
    Например, можно сделать так:
    В начало скрипта:
    PHP код:
    static const
        
    Floatdangerous_coords[][] = { // 3 координаты точек по осям: X, Y, Z и радиус
            
    {0.00.00.050.0}
            {
    1.11.11.120.0}
            {
    2.22.23.342.5}
        }; 
    В односекундный таймер:
    PHP код:
    for(new 0sizeof(dangerous_coords); p++) {
        if (
    IsPlayerInRangeOfPoint(iteriddangerous_coords[p][3], dangerous_coords[p][0], dangerous_coords[p][1], dangerous_coords[p][2])) {
            
    // some code
        
    }

    Вместо iterid вписываете вашу переменную, отвечающую за цикл. Обычно она обозначается как i.
    Последний раз редактировалось L0ndl3m; 24.12.2014 в 23:27.

  8. Пользователь сказал cпасибо:
    Albert (29.12.2014)
  9. #6
    Аватар для Albert
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.12.2014
    Сообщений
    109
    Репутация:
    0 ±
    как сделать односекундный таймер для отдельного игрока?

  10. #7
    Аватар для L0ndl3m
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±
    В OnGameModeInit:
    PHP код:
    SetTimer("@__global_timer"10001); 
    В конец скрипта ( в цикле уже встроен предложенный мною код ):
    PHP код:
    @__global_timer();
    @
    __global_timer() {

        new
            
    GetMaxPlayers();

        do {
            --
    i;
            if(!
    IsPlayerConnected(i))
                continue;

            for(new 
    0sizeof(dangerous_coords); p++) {
                if (
    IsPlayerInRangeOfPoint(idangerous_coords[p][3], dangerous_coords[p][0], dangerous_coords[p][1], dangerous_coords[p][2])) {
                    
    // some code
                
    }
            }
        }
        while(
    i);


  11. Пользователь сказал cпасибо:
    Albert (29.12.2014)
  12. #8
    Аватар для L0ndl3m
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±
    Проблема решена?

  13. Пользователь сказал cпасибо:
    Albert (29.12.2014)
  14. #9
    Аватар для Albert
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.12.2014
    Сообщений
    109
    Репутация:
    0 ±
    проверю когда домой вернуть. в воскресенье вечером. сперва хочу регистрацию починить

  15. #10
    Аватар для Albert
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.12.2014
    Сообщений
    109
    Репутация:
    0 ±
    Получилось. Всем спасибо. Только ставлю -15 хп и меня сразу убивает.
    if(IsPlayerInRangeOfPoint(playerid, 50.0, -2155.3828,-2314.1523,30.4765))
    {
    SetPlayerHealth(playerid, -15.0); // íàïðèìåð: SetPlayerHealth(playerid, -25.0);
    SendClientMessage(playerid, 0xFFFFFFFF, "* Âû â ðàäèîàêòèâíîé çîíå!");
    }
    Как указать сколько хп снять игроку?

    Кажется так?

    Код:
    new Float:PH;
    		GetPlayerHealth(playerid, PH); //ïðîâåðÿåì ñêîëüêî ó èãðîêà õï
            SetPlayerHealth(playerid, PH-10); //îòíèìàåì õï ó èãðîêà(ñêîëüêî áûëî - 10)
            SendClientMessage(playerid, 0xFFFFFFFF, "* Âû â ðàäèîàêòèâíîé çîíå!");
    И всёже я не совсем понял как вместо глобального таймера указать таймер на каждого игрока в отдельности
    Последний раз редактировалось Albert; 29.12.2014 в 12:37.

 

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

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

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