Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 8 из 8
  1. #1
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±

    Не могу понять как работать с SetPlayerCheckpoint

    Здравствуйте, кое в чем запутался! Подробнее.. Делаю систему поставок армии СФ в армию ЛВ с SAMP-RP. В чем суть...

    Игрок садится в матолет (он же cargobob), прописывает /carm и ему на карте показывается чекпоинт на корабль, где загружаться. НО! Эту систему можно обойти, можно например в /gps выбрать ближайшее место, подлететь туда, и матолет ВСЕ РАВНО загрузится...

    Как эту недоработку можно исправить, ведь при создании чекпоинта они не возвращают какого-то уникального айди (напримере CreateDynamicCP, чтобы потом в OnPlayerEnterDynamicCP сверять ид чекпоинта на какой игрок наступил)....
    Последний раз редактировалось StevenH; 08.05.2017 в 00:41.

  2. #2
    Аватар для wAx
    ¯\_(ツ)_/¯

    Статус
    Оффлайн
    Регистрация
    13.12.2013
    Сообщений
    377
    Репутация:
    146 ±
    Цитата Сообщение от StevenH Посмотреть сообщение
    Здравствуйте, кое в чем запутался! Подробнее.. Делаю систему поставок армии СФ в армию ЛВ с SAMP-RP. В чем суть...

    Игрок садится в матолет (он же cargobob), прописывает /carm и ему на карте показывается чекпоинт на корабль, где загружаться. НО! Эту систему можно обойти, можно например в /gps выбрать ближайшее место, подлететь туда, и матолет ВСЕ РАВНО загрузится...

    Как эту недоработку можно исправить, ведь при создании чекпоинта они не возвращают какого-то уникального айди (напримере CreateDynamicCP, чтобы потом в OnPlayerEnterDynamicCP сверять ид чекпоинта на какой игрок наступил)....
    проверять по координатам?

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Или же вести этот самый ID самостоятельно, создав отдельный массив для этого и при создании каждого чекпоинта приравнивать массив к определённому значению, а когда чекпоинт взят - обнулять. Так можно определять, показан ли игроку чекпоинт или нет
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  4. #4
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Или же вести этот самый ID самостоятельно, создав отдельный массив для этого и при создании каждого чекпоинта приравнивать массив к определённому значению, а когда чекпоинт взят - обнулять. Так можно определять, показан ли игроку чекпоинт или нет
    Логику 50/50 уловил, днем попробую это реализовать, если я правильное имею представление...

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

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Или же вести этот самый ID самостоятельно, создав отдельный массив для этого и при создании каждого чекпоинта приравнивать массив к определённому значению, а когда чекпоинт взят - обнулять. Так можно определять, показан ли игроку чекпоинт или нет
    Видимо я что то не уловил, пример можно?

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    PHP код:
    new player_checkpint_id[MAX_PLAYERS];


    public 
    OnPlayerCommandText(playeridcmdtext[])
    {
        if(!
    strcmp(cmdtext"/showcp_1"false))
        {
            if(
    player_checkpint_id[playerid] != 0)
                return 
    SendClientMessage(playerid0xFF0000FF"Ошибка: {FFFFFF}Вам уже был показан один чекпоинт");
            
    player_checkpint_id[playerid] = 1;
            
    SetPlayerCheckpoint(...);
            
    SendClientMessage(playerid, -1"Показан чекпоинт №1");
            return 
    1;
        }
        else if(!
    strcmp(cmdtext"/showcp_2"false))
        {
            if(
    player_checkpint_id[playerid] != 0)
                return 
    SendClientMessage(playerid0xFF0000FF"Ошибка: {FFFFFF}Вам уже был показан один чекпоинт");
            
    player_checkpint_id[playerid] = 2;
            
    SetPlayerCheckpoint(...);
            
    SendClientMessage(playerid, -1"Показан чекпоинт №2");
            return 
    1;
        }
        else if(!
    strcmp(cmdtext"/showcp_3"false))
        {
            if(
    player_checkpint_id[playerid] != 0)
                return 
    SendClientMessage(playerid0xFF0000FF"Ошибка: {FFFFFF}Вам уже был показан один чекпоинт");
            
    player_checkpint_id[playerid] = 3;
            
    SetPlayerCheckpoint(...);
            
    SendClientMessage(playerid, -1"Показан чекпоинт №3");
            return 
    1;
        }
        else if(!
    strcmp(cmdtext"/hidecp"false))
        {
            if(
    player_checkpint_id[playerid] == 0)
                return 
    SendClientMessage(playerid0xFF0000FF"Ошибка: {FFFFFF}Вам не показан ни один чекпоинт");
            
    player_checkpint_id[playerid] = 0;
            
    DisablePlayerCheckpoint(playerid);
            
    SendClientMessage(playerid, -1"Чекпоинт скрыт");
            return 
    1;
        }
    }


    public 
    OnPlayerEnterCheckpoint(playerid)
    {
        switch(
    player_checkpint_id[playerid])
        {
            case 
    0:
            {
                
    DisablePlayerCheckpoint(playerid);
                
    SendClientMessage(playerid0xFF0000FF"Ошибка: {FFFFFF}Вам не был показан ни один чекпоинт");
            }
            case 
    1:
            {
                
    SendClientMessage(playerid, -1"Вы взяли чекпоинт под №1");
                
    DisablePlayerCheckpoint(playerid);
                
    player_checkpint_id[playerid] = 0;
            }
            case 
    2:
            {
                
    SendClientMessage(playerid, -1"Вы взяли чекпоинт под №2");
                
    DisablePlayerCheckpoint(playerid);
                
    player_checkpint_id[playerid] = 0;
            }
            case 
    3:
            {
                
    SendClientMessage(playerid, -1"Вы взяли чекпоинт под №3");
                
    SendClientMessage(playerid, -1"Выйдите с него для его исчезновения");
            }
        }
    }

    public 
    OnPlayerLeaveCheckpoint(playerid)
    {
        switch(
    player_checkpint_id[playerid])
        {
            case 
    3:
            {
                
    SendClientMessage(playerid, -1"Вы вышли с чекпоинта под №3");
                
    DisablePlayerCheckpoint(playerid);
                
    player_checkpint_id[playerid] = 0;
            }
        }    

    Хотя удобнее будет написать свои аналоги функций, а-ля:
    PHP код:
    stock SetPlayerCheckpointEx(playeridFloat:xFloat:yFloat:zFloat:sizecheckpointid)
    {
        if(
    checkpointid == 0)
            return 
    0;
        
    player_checkpint_id[playerid] = checkpointid;
        return 
    SetPlayerCheckpoint(playeridxyzsize);
    }

    stock DisablePlayerCheckpointsForPlayer(playerid)
    {
        
    player_checkpint_id[playerid] = 0;
        return 
    DisablePlayerCheckpoint(playerid);

    И уже использовать их для создания чекпоинтов
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    06.04.2017
    Сообщений
    7
    Репутация:
    0 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    PHP код:
    new player_checkpint_id[MAX_PLAYERS];


    public 
    OnPlayerCommandText(playeridcmdtext[])
    {
        if(!
    strcmp(cmdtext"/showcp_1"false))
        {
            if(
    player_checkpint_id[playerid] != 0)
                return 
    SendClientMessage(playerid0xFF0000FF"Ошибка: {FFFFFF}Вам уже был показан один чекпоинт");
            
    player_checkpint_id[playerid] = 1;
            
    SetPlayerCheckpoint(...);
            
    SendClientMessage(playerid, -1"Показан чекпоинт №1");
            return 
    1;
        }
        else if(!
    strcmp(cmdtext"/showcp_2"false))
        {
            if(
    player_checkpint_id[playerid] != 0)
                return 
    SendClientMessage(playerid0xFF0000FF"Ошибка: {FFFFFF}Вам уже был показан один чекпоинт");
            
    player_checkpint_id[playerid] = 2;
            
    SetPlayerCheckpoint(...);
            
    SendClientMessage(playerid, -1"Показан чекпоинт №2");
            return 
    1;
        }
        else if(!
    strcmp(cmdtext"/showcp_3"false))
        {
            if(
    player_checkpint_id[playerid] != 0)
                return 
    SendClientMessage(playerid0xFF0000FF"Ошибка: {FFFFFF}Вам уже был показан один чекпоинт");
            
    player_checkpint_id[playerid] = 3;
            
    SetPlayerCheckpoint(...);
            
    SendClientMessage(playerid, -1"Показан чекпоинт №3");
            return 
    1;
        }
        else if(!
    strcmp(cmdtext"/hidecp"false))
        {
            if(
    player_checkpint_id[playerid] == 0)
                return 
    SendClientMessage(playerid0xFF0000FF"Ошибка: {FFFFFF}Вам не показан ни один чекпоинт");
            
    player_checkpint_id[playerid] = 0;
            
    DisablePlayerCheckpoint(playerid);
            
    SendClientMessage(playerid, -1"Чекпоинт скрыт");
            return 
    1;
        }
    }


    public 
    OnPlayerEnterCheckpoint(playerid)
    {
        switch(
    player_checkpint_id[playerid])
        {
            case 
    0:
            {
                
    DisablePlayerCheckpoint(playerid);
                
    SendClientMessage(playerid0xFF0000FF"Ошибка: {FFFFFF}Вам не был показан ни один чекпоинт");
            }
            case 
    1:
            {
                
    SendClientMessage(playerid, -1"Вы взяли чекпоинт под №1");
                
    DisablePlayerCheckpoint(playerid);
                
    player_checkpint_id[playerid] = 0;
            }
            case 
    2:
            {
                
    SendClientMessage(playerid, -1"Вы взяли чекпоинт под №2");
                
    DisablePlayerCheckpoint(playerid);
                
    player_checkpint_id[playerid] = 0;
            }
            case 
    3:
            {
                
    SendClientMessage(playerid, -1"Вы взяли чекпоинт под №3");
                
    SendClientMessage(playerid, -1"Выйдите с него для его исчезновения");
            }
        }
    }

    public 
    OnPlayerLeaveCheckpoint(playerid)
    {
        switch(
    player_checkpint_id[playerid])
        {
            case 
    3:
            {
                
    SendClientMessage(playerid, -1"Вы вышли с чекпоинта под №3");
                
    DisablePlayerCheckpoint(playerid);
                
    player_checkpint_id[playerid] = 0;
            }
        }    

    Хотя удобнее будет написать свои аналоги функций, а-ля:
    PHP код:
    stock SetPlayerCheckpointEx(playeridFloat:xFloat:yFloat:zFloat:sizecheckpointid)
    {
        if(
    checkpointid == 0)
            return 
    0;
        
    player_checkpint_id[playerid] = checkpointid;
        return 
    SetPlayerCheckpoint(playeridxyzsize);
    }

    stock DisablePlayerCheckpointsForPlayer(playerid)
    {
        
    player_checkpint_id[playerid] = 0;
        return 
    DisablePlayerCheckpoint(playerid);

    И уже использовать их для создания чекпоинтов
    Так а зачем? Есть же специальная функция в стримере:
    PHP код:
    CreateDynamicCP(Float:xFloat:yFloat:zFloat:sizeworldid = -1interiorid = -1playerid = -1Float:streamdistance STREAMER_CP_SDSTREAMER_TAG_AREA areaid STREAMER_TAG_AREA -1priority 0); 
    И не придется выводить какие-то дополнительные массивы с волшебными цифрами, достаточно будет просто использовать
    PHP код:
    OnPlayerEnterDynamicCP(playeridSTREAMER_TAG_CP checkpointid); 

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Mr.Forest Посмотреть сообщение
    Так а зачем? Есть же специальная функция в стримере:
    PHP код:
    CreateDynamicCP(Float:xFloat:yFloat:zFloat:sizeworldid = -1interiorid = -1playerid = -1Float:streamdistance STREAMER_CP_SDSTREAMER_TAG_AREA areaid STREAMER_TAG_AREA -1priority 0); 
    И не придется выводить какие-то дополнительные массивы с волшебными цифрами, достаточно будет просто использовать
    PHP код:
    OnPlayerEnterDynamicCP(playeridSTREAMER_TAG_CP checkpointid); 
    Автор темы не спрашивал какие есть варианты раоты с чекпоинтами. Он спросил как можно отслеживать какой из чекпоинтов, показанный через SetPlayerCheckpoint, показан игроку.
    Да и разницы, по сути, никакой нет, кроме того, что в стримере можно сразу несколько чекпоинтов показывать. Общий принцип и у стримера, и у моей реализации одинаков.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

 

 

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

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

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

Ваши права

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