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

Тема: W_Points v2.3

  1. #1
    Пользователь Аватар для White_116
    Регистрация
    12.08.2011
    Адрес
    Нурлат
    Возраст
    31
    Сообщений
    78
    Репутация: 9

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

    Подмигивание W_Points v2.3

    Здравствуйте!


    Представляю вашему вниманию "стример" точек.

    Что же это такое спросите вы - это быстрое нахождение в какой из созданных точек находится игрок.
    Создан специально чтобы искоренить медленную и не рациональную конструкцию вида:
    PHP код:
    stock IsPlayerIn(playerid)
    {
        for(new 
    0sizeof(coords); i++)
            if(
    IsPlayerInRangeOfPoint(playerid1.0coords[i][0], coords[i][1], coords[i][2]))return 1;
        return 
    0;

    Основан он на зональной предварительной отсортировки, что придаёт значительную скорость обработки, так как откидывается большая часть лишних проверок.

    Область применения:
    - заменяем пикапы для домов/бизов на точки.
    - создание ворот
    - место заправки
    - возможность создать псевдочекпойнты или мины.
    - отслеживание в какой точке находится игрок, для захвата территории, пополнение очков и т.п.
    Основные функции:
    PHP код:
    native IsValidPoint(pointid);// Существует ли точка
    native CreatePoint(Float:xFloat:yFloat:zFloat:rworldid=-1interior=-1);// Cоздаёт точку (х, у, z, радиус, вирт.мир, интерьер). Вернёт ид точки, иначе ид ошибки.
    native DestroyPoint(pointid);// Удаляет точку
    native DestroyAllPoint();// Удаляет все точки
    native SetPointPos(pointidFloat:xFloat:yFloat:z);//Переместить точку
    native GetPointPos(pointid, &Float:x, &Float:y, &Float:z);//Узнать координаты точки
    native SetPointRadius(pointidFloat:r);//Установить радиус точки
    native GetPointRadius(pointid, &Float:r);//Узнать радиус точки
    native SetPointInterior(pointidinterior);//Установить интерьер точки
    native GetPointInterior(pointid);//Узнать интерьер точки
    native SetPointVirtualWorld(pointidworldid);//Установить вирт.мир точки
    native GetPointVirtualWorld(pointid);//Узнать вирт.мир точки
    native GetPlayerPoint(playeridmode=0); //Узнает в какой точке находится игрок. Возвращает ид найденной точки.
    native GetPlayerMultiPoint(playeridMP[], Size);//Узнает в каких точках находится игрок. Возвращает количество найденных точек
    native GetVehiclePoint(vehicleidmode=0);//Узнает в какой точке находится транспорт (самую близлежащую, самую близлежащую с проверкой радиуса, самую первую которая входит в радиус)
    native GetVehicleMultiPoint(vehicleidMP[], Size);//Узнает в каких точках находится транспорт 
    GetPlayerPoint(playerid, 0); Ищет самую близлежащую точку в которой находится игрок.
    GetPlayerPoint(playerid, 1); Ищет самую близлежащую точку даже если игрок не находится в ней.
    GetPlayerPoint(playerid, 2); Ищет до первой точки в которой находится игрок.
    GetPlayerMultiPoint(playerid, MP[], Size); Ищет все точки в которых находится игрок пока они не закончатся или не достигнут Size.
    Небольшой Тест всего 40,000 точек, симуляция 1000 игроков. Ищется самая близлежащая точка. Для правильности теста нужно быть на сервере, возле нулевых координат!

    Create W_Points 473 ms
    GetW_Point 20 ms

    Create StreamerPoints 35 ms
    GetStreamerPoint 329 ms

    GetClassicPoint 11479 ms

    y_areas выдаёт для одного игрока ~5 ms, осталось домножить на 1000.

    Внимание!
    1) Настоятельно рекомендую не ставить радиус больше MAX_POINTS_SETKA_DLINA, так как при нахождения точки может возникнуть казус: вы входите в радиус но точка не определяется. Связано это с отсутствием ссылки на точку.
    2) Поддержка интерьеров и виртуальных миров по умолчанию отключена. Для того чтобы включить выполняем следующие:
    PHP код:
    #define PointWorld //включаем вирт.мир
    #define PointInterior //включаем интерьер
    #include <W_PS> //подключаем инклуд 
    <<< Примеры >>>
    Использование GetPlayerMultiPoint:
    PHP код:
    new pointarray[32];//создали массив куда пишем иды точек.
    new kolichestvo=GetPlayerMultiPoint(playeridpointarraysizeof(pointarray));//поиск точек, вернёт количество найденных точек.
    for(kolichestvo=kolichestvo-1kolichestvo > -1kolichestvo--)printf("pointid = %d",pointarray[kolichestvo]); 
    Псевдочекпойнт:
    PHP код:
    new Point[MAX_PLAYERS];//Куда нибудь в начало, хранит ид точки в которой находится игрок.
    stock PointUpdate(playerid)//В любой таймер с перебором игроков
    {
        new 
    newppoint=GetPlayerPoint(playerid);//Ищем самую близлежайшую точку в которой находится игрок
        
    if(Point[playerid] != newppoint)//Если точка отличается от старой.
        
    {
            if(
    Point[playerid] != 0)    OnPlayerLeavePoint(playeridPoint[playerid]);//Если мы были в точке
            
    if(newppoint != 0)            OnPlayerEnterPoint(playeridnewppoint);//Если новая точка точка.
            
    Point[playerid]=newppoint;//Запомним точку
        
    }
        return 
    1;
    }
    stock OnPlayerLeavePoint(playeridpointid)
    {
    //...
    }
    stock OnPlayerEnterPoint(playeridpointid)
    {
    //...

    Пример 3:
    PHP код:
    #include <a_samp>

    #define MAX_POINTS (10)
    #define MAX_POINTS_TO_STREAM (10)
    #define PointWorld
    #define PointInterior
    #define DeBug

    #include <W_PS>

    #define Biznes (1)
    #define Home (2)

    new PointData[3][MAX_POINTS+1 char];
    new 
    BizKolvo;
    new 
    HomeKolvo;
    new 
    Timer;
    new 
    Point[MAX_PLAYERS];//Куда нибудь в начало, хранит ид точки в которой находится игрок.
    //==============================================================================
    public OnFilterScriptInit()
    {
         
    Timer=SetTimer("PointUpdate",100,1);
        return 
    1;
    }
    public 
    OnFilterScriptExit()
    {
         
    KillTimer(Timer);
        return 
    1;
    }
    public 
    OnPlayerCommandText(playeridcmdtext[])
    {
        if(
    strcmp("/biz"cmdtexttrue4) == 0)
        {
            
    CreateBiz(playerid);
            return 
    1;
        }
        if(
    strcmp("/home"cmdtexttrue5) == 0)
        {
            
    CreateHome(playerid);
            return 
    1;
        }
        if(
    strcmp("/del"cmdtexttrue4) == 0)
        {
            
    DestroyPoint(MAX_POINTS);
            return 
    1;
        }
        if(
    strcmp("/pos"cmdtexttrue4) == 0)
        {
            new 
    Float:x,Float:y,Float:z;
            
    GetPlayerPos(playeridx,y,z);
            
    SetPointPos(MAX_POINTSxyz);
            return 
    1;
        }
        return 
    0;
    }
    //==============================================================================
    forward PointUpdate();
    public 
    PointUpdate()//В любой таймер с перебором игроков
    {
        for(new 
    playeridplayerid MAX_PLAYERSplayerid++)
        if(
    IsPlayerConnected(playerid))
        {
            new 
    newppoint=GetPlayerPoint(playerid);//Ищем самую близлежайшую точку в которой находится игрок
            
    if(Point[playerid] != newppoint)//Если точка отличается от старой.
            
    {
                if(
    Point[playerid] != 0)    OnPlayerLeavePoint(playeridPoint[playerid]);//Если мы были в точке
                
    if(newppoint != 0)            OnPlayerEnterPoint(playeridnewppoint);//Если новая точка точка.
                
    Point[playerid]=newppoint;//Запомним точку
            
    }
        }
        return 
    1;
    }

    stock OnPlayerLeavePoint(playeridpointid)
    {
        new 
    str[128];
        if(
    PointData[0]{pointid} == Homeformat(str,sizeof(str),"Вы покинули дом номер %d, хозяин %d",PointData[1]{pointid},PointData[2]{pointid});
        else 
    format(str,sizeof(str),"Вы покинули бизнес номер %d, хозяин %d",PointData[1]{pointid},PointData[2]{pointid});
        return 
    SendClientMessage(playerid,-1,str);
    }

    stock OnPlayerEnterPoint(playeridpointid)
    {
        new 
    str[128];
        if(
    PointData[0]{pointid} == Homeformat(str,sizeof(str),"Вы вошли в дом номер %d, хозяин %d",PointData[1]{pointid},PointData[2]{pointid});
        else 
    format(str,sizeof(str),"Вы вошли в бизнес номер %d, хозяин %d",PointData[1]{pointid},PointData[2]{pointid});
        return 
    SendClientMessage(playerid,-1,str);
    }

    stock CreateBiz(playerid)
    {
        new 
    Float:x,Float:y,Float:z;
        
    GetPlayerPos(playeridx,y,z);
        new 
    p=CreatePoint(x,y,z10.0);
        if(
    1)
        {
            if(
    == 0printf("Привышено максимальное количество точек.");
            if(
    == -1)printf("Привышено максимальное количество точек в чанке.");
            if(
    == -2)printf("Поддержка вирт.миров отключена!");
            if(
    == -3)printf("Поддержка интерьеров отключена!");
            return 
    0;
        }
        
    BizKolvo++;
        
    PointData[0]{p}=Biznes;//Запомним тип точки
        
    PointData[1]{p}=BizKolvo;//Запомни ид бизнеса
        
    PointData[2]{p}=playerid;//Запомним владельца
        
    return BizKolvo;
    }

    stock CreateHome(playerid)
    {
        new 
    Float:x,Float:y,Float:z;
        
    GetPlayerPos(playeridx,y,z);
        new 
    p=CreatePoint(x,y,z10.0);
        if(
    1)
        {
            if(
    == 0printf("Привышено максимальное количество точек.");
            if(
    == -1)printf("Привышено максимальное количество точек в чанке.");
            if(
    == -2)printf("Поддержка вирт.миров отключена!");
            if(
    == -3)printf("Поддержка интерьеров отключена!");
            return 
    0;
        }
        
    HomeKolvo++;
        
    PointData[0]{p}=Home;//Запомним тип точки
        
    PointData[1]{p}=HomeKolvo;//Запомни ид дома
        
    PointData[2]{p}=playerid;//Запомним владельца
        
    return HomeKolvo;


    >> Скачать W_Points v2.3: SolidFiles
    >> Просмотреть W_Points v2.3: Pastebin

    >> Скачать W_Points v2.2: SolidFiles
    >> Просмотреть W_Points v2.2: Pastebin

    >> Скачать W_Points v2.1: SolidFiles
    >> Просмотреть W_Points v2.1: Pastebin

    W_Points v2.1:
    -Добавлен поиск точек для транспорта.
    -Исправлен баг в GetPlayerPoint(playerid, 2); связанный с лишним кодом.
    W_Points v2.2:
    -Исправлены мелкие ошибки.
    -Новый метод поиска предложенный AirKite
    W_Points v2.3:
    Исправлено перемещение точки SetPointPos.

  2. #2
    dream bigger Аватар для spc.
    Регистрация
    26.04.2013
    Адрес
    Омск
    Возраст
    27
    Сообщений
    1,327
    Репутация: 137

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

    Re: W_Points v2.2

    пикапы чтоли?
    Skype: sp3ctrum_attack

  3. #3
    Пользователь Аватар для White_116
    Регистрация
    12.08.2011
    Адрес
    Нурлат
    Возраст
    31
    Сообщений
    78
    Репутация: 9

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

    Re: W_Points v2.2

    Нет. Но можно с помощью данного инклуда сделать и пикапы, чекпойнты, телепорты и т.д.
    Можно на данной базе сделать стример иконок, пикапов, чекпойнтов.

  4. #4
    dream bigger Аватар для spc.
    Регистрация
    26.04.2013
    Адрес
    Омск
    Возраст
    27
    Сообщений
    1,327
    Репутация: 137

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

    Re: W_Points v2.2

    молодец, плюс
    Skype: sp3ctrum_attack

  5. #5
    Активный пользователь Аватар для Fleamcer
    Регистрация
    03.08.2010
    Адрес
    pawncc.exe
    Сообщений
    726
    Репутация: 30

    Звание: на пути к лучшему

    Re: W_Points v2.2

    Что система упрощенных диалогов, что стример не нужны и никто использовать не будет так как не пригодится. Спасибо.

  6. #6
    Пользователь Аватар для White_116
    Регистрация
    12.08.2011
    Адрес
    Нурлат
    Возраст
    31
    Сообщений
    78
    Репутация: 9

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

    Re: W_Points v2.2

    Мне кажется, что просто никто не понимает для чего это всё. :bk:

  7. #7
    Активный пользователь Аватар для Fleamcer
    Регистрация
    03.08.2010
    Адрес
    pawncc.exe
    Сообщений
    726
    Репутация: 30

    Звание: на пути к лучшему

    Re: W_Points v2.2

    Честно говоря я так считаю, но все равно уважаю труд людей поэтому удачи с последующими разработками.

  8. #8
    ?????? Аватар для Иваныч
    Регистрация
    10.02.2011
    Адрес
    Vlz
    Возраст
    28
    Сообщений
    4,152
    Репутация: 403

    Звание: - очень-очень хороший человек

    Re: W_Points v2.2

    Цитата Сообщение от JDean Посмотреть сообщение
    Что система упрощенных диалогов, что стример не нужны и никто использовать не будет так как не пригодится. Спасибо.
    Ты о какой системе упрощенных диалогов говоришь?
    Которая была на п-и? Да никто, потому что она бесполезна.
    Здесь другая работа

  9. #9
    Пользователь Аватар для Allert
    Регистрация
    10.05.2013
    Сообщений
    20
    Репутация: 5

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

    Re: W_Points v2.2

    Цитата Сообщение от JDean Посмотреть сообщение
    Честно говоря я так считаю, но все равно уважаю труд людей поэтому удачи с последующими разработками.
    Если ты - все, то да, никто не будет использовать.

  10. #10
    Активный пользователь Аватар для Fleamcer
    Регистрация
    03.08.2010
    Адрес
    pawncc.exe
    Сообщений
    726
    Репутация: 30

    Звание: на пути к лучшему

    Re: W_Points v2.2

    Хватит обижать человека до такой степени, я лишь сказал что не будут использовать для стимула сделать что нибудь интересное.

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

Ваши права

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