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

    Статус
    Оффлайн
    Регистрация
    31.03.2016
    Сообщений
    257
    Репутация:
    3 ±
    Теперь знаю больше, спасибо огромное за помощь

  2. #12
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Я тут вчера набросал реализацию своей идеи (начал делать заготовку для инклюда) и вот что вышло (может кому пригодится)
      Открыть/закрыть
    PHP код:
    #if !defined DEFAULT_PLAYER_MARKER_RADIUS
        #define DEFAULT_PLAYER_MARKER_RADIUS 300.0
    #endif
    enum e_PLAYER_MARKER_INFO
    {
        
    mark_id,
        
    Float:mark_radius,
        
    transparent
    }
    new 
    pl_mark[MAX_PLAYERS][e_PLAYER_MARKER_INFO];


    stock TogglePlayerOnMapForPlayer(playeridshowplayeridbool:visible
    {
        new 
    map_color GetPlayerColor(showplayerid);
        if((
    map_color 0xFF) != 0x00pl_mark[playerid][transparent] = map_color 0xFF;
        
    SetPlayerMarkerForPlayer(playeridshowplayerid, (map_color 0xFF) - (visible 0x00 pl_mark[playerid][transparent]));
        return 
    1;
    }    

    stock UpdateRadiusForPlayerMarker(playeridFloat:radius)
    {
        if(
    pl_mark[playerid][mark_id] == -1) return 0;
        
    pl_mark[playerid][mark_radius] = radius;
        
    DestroyDynamicArea(pl_mark[playerid][mark_id]);
        
    printf("\n%d"pl_mark[playerid][mark_id] = CreateDynamicSphere(0.00.00.0pl_mark[playerid][mark_radius], -1, -1, -1));
        
    printf("%d\n"AttachDynamicAreaToPlayer(pl_mark[playerid][mark_id], playerid));
        return 
    1;
    }

    cmd:radius(playeridparams[]) 
    {
        if(
    isnull(params) || !(params[0] >= '0' && params[0] <= '9')) return SendClientMessage(playerid, -1"Введите СЂР°РґРёСѓСЃ");
        new 
    Floatradius float(strval(params));
        new 
    string[30];
        foreach(new 
    iPlayer)
        {
            
    format(stringsizeof(string), "%d"UpdateRadiusForPlayerMarker(playeridradius));
            
    SendClientMessage(playerid, -1string);
        }
        return 
    1;
    }  


    public 
    OnGameModeInit()
    {
        
    ShowPlayerMarkers(PLAYER_MARKERS_MODE_GLOBAL);  
        
    LimitPlayerMarkerRadius(10000.0);
        for(new 
    isizeof(pl_mark); i++)
        {
            
    pl_mark[i][mark_id] = -1;
            
    pl_mark[i][transparent] = 0xFF;
            
    pl_mark[i][mark_radius] = DEFAULT_PLAYER_MARKER_RADIUS;
        }
        return 
    1;
    }

    public 
    OnPlayerSpawn(playerid)
    {
        if(
    pl_mark[playerid][mark_id] == -1)
        {
            
    pl_mark[playerid][mark_id] = CreateDynamicSphere(0.00.00.0pl_mark[playerid][mark_radius], -1, -1, -1);
            
    AttachDynamicAreaToPlayer(pl_mark[playerid][mark_id], playerid);
        }

        
    SetPlayerPos(playerid1830.37831340.157214.3746);
        return 
    1;
    }

    public 
    OnPlayerDisconnect(playeridreason)
    {
        if(
    pl_mark[playerid][mark_id] != -1)
        {
            
    DestroyDynamicArea(pl_mark[playerid][mark_id]);
            
    pl_mark[playerid][mark_id] = -1;
        }
        
    pl_mark[playerid][transparent] = 0xFF;
        return 
    1;
    }


    public 
    OnPlayerEnterDynamicArea(playeridareaid)
    {
        new 
    string[30];
        foreach(new 
    iPlayer)
        {
            if(
    == playerid) continue;
            if(
    areaid != pl_mark[i][mark_id]) continue;
            
    TogglePlayerOnMapForPlayer(iplayeridtrue);
            
    format(stringsizeof(string), "%d показан для %d"playeridi);
            
    SendClientMessageToAll(-1string);

        }
        return 
    1;
    }
    public 
    OnPlayerLeaveDynamicArea(playeridareaid)
    {
        new 
    string[30];
        foreach(new 
    iPlayer)
        {
            if(
    == playerid) continue;
            if(
    areaid != pl_mark[i][mark_id]) continue;
            
    TogglePlayerOnMapForPlayer(iplayeridfalse);
            
    format(stringsizeof(string), "%d скрыт для %d"playeridi);
            
    SendClientMessageToAll(-1string);
        }
        return 
    1;



    Код чисто написан для теста (некоторая "ненужная" информация выдаётся в чат и прочее) и я сразу пытался адаптировать его под расширенные возможности (обновлять радиус отображения маркеров для всех/определённого игрока прямо в игре и т.п.). В общем, чисто на посмотреть.

    P.S. Тестировал всё на одном компьютере с использованием песочницы и заметил, что то ли функция AttachDynamicAreaToPlayer отказывается крепить зону к игроку, который АФК, то ли OnPlayerEnterDynamicArea/OnPlayerLeaveDynamicArea как-то отказывается срабатывать нормально, но смысл в том, что если попробовать обновить радиус зон (пока реализовано обновление для всех сразу) и кто-то будет стоять АФК, система начнёт глючить (у АФК-шника радиус зоны останется старым).
    Вполне возможно, что это косяк моего кода. Вчера просто не было времени проверить. Просто если кто-то решит копаться в моём говнокоде, имейте это ввиду.
    И да, я, похоже, стандартные маркеры настроил немного неверно. В общем, работать ещё есть над чем :3


    UPD: Бага с AFK никакого нет. Всему виной мои кривые руки и невнимательность. Скоро запилю инклюд
    Последний раз редактировалось DeimoS; 14.07.2016 в 18:42.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  3. #13
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    LimitPlayerMarkerRadius лучше убрать, чтобы внутренний стриммер не рассчитывал дистанцию.

  4. Пользователь сказал cпасибо:
    DeimoS (12.07.2016)
 

 
Страница 2 из 2 ПерваяПервая 1 2

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

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

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

Ваши права

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