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

    Статус
    Оффлайн
    Регистрация
    13.07.2016
    Сообщений
    29
    Репутация:
    2 ±

    GetPlayerDistanceFromPoint, баг

    Собственно столкнулся с багом в GetPlayerDistanceFromPoint. Приведу пару примеров..

    1. не работающий случай
    PHP код:
    // некоторый код который тут не нужен
    new Floatdis GetPlayerDistanceFromPoint(playeridold_pos[0], old_pos[1], old_pos[2]);
    old_pos[0] = pos[0];
    old_pos[1] = pos[1];
    old_pos[2] = pos[2]; 
    В итоге наша dis всегда вернет 0.0

    2. работающий случай
    PHP код:
    // некоторый код который тут не нужен
    new Floatdis GetPlayerDistanceFromPoint(playeridold_pos[0], old_pos[1], old_pos[2]);
    GetPlayerPos(playeridold_pos[0], old_pos[1], old_pos[2]); 
    В итоге все хорошо и dis вернет все что надо.

    Но 2 вариант мне не подходит так как новые координаты игрока приходят. Собственно как заставить работать 1 вариант ?

  2. #2
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от TBoPoIIIoK Посмотреть сообщение
    столкнулся с багом в GetPlayerDistanceFromPoint
    Прежде, чем делать такие выводы, сперва научитесь пользоваться той функцией.


    Цитата Сообщение от TBoPoIIIoK Посмотреть сообщение
    1. не работающий случай
    PHP код:
    // некоторый код который тут не нужен
    new Floatdis GetPlayerDistanceFromPoint(playeridold_pos[0], old_pos[1], old_pos[2]);
    old_pos[0] = pos[0];
    old_pos[1] = pos[1];
    old_pos[2] = pos[2]; 
    В итоге наша dis всегда вернет 0.0

    2. работающий случай
    PHP код:
    // некоторый код который тут не нужен
    new Floatdis GetPlayerDistanceFromPoint(playeridold_pos[0], old_pos[1], old_pos[2]);
    GetPlayerPos(playeridold_pos[0], old_pos[1], old_pos[2]); 
    В итоге все хорошо и dis вернет все что надо.
    В обоих случаях функция GetPlayerDistanceFromPoint используется одинаково: аргументы передаются одни и те же, а результат записывается в ту же самую переменную.
    Точно причину разных значений в dis назвать сложно (ещё меньше кода не могли показать?), но ясно, что дело в вашем коде до или после вызова той функции.


    Цитата Сообщение от TBoPoIIIoK Посмотреть сообщение
    Собственно как заставить работать 1 вариант ?
    Этого вам никто не скажет, пока вы не покажете больше кода.


    UPD: Только что заметил, что в 2-м варианте вы используете GetPlayerPos. Вангую, что вы использовали ту функцию и в 1-м варианте до GetPlayerDistanceFromPoint (но почему-то решили не показывать этого), записав координаты игрока в old_pos.
    Как результат, GetPlayerDistanceFromPoint возвращает расстояние от координат игрока до самих же себя, т.е. 0.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  3. #3
    Аватар для TBoPoIIIoK
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.07.2016
    Сообщений
    29
    Репутация:
    2 ±
    PHP код:
    public OnPlayerReceivedPacket(player_idpacket_idBitStream:bs)
    {
        if(
    packet_id == ID_PLAYER_SYNC)
        {
        new 
    lrkeysudkeyssampkeys,
        
    Float:pos[3], Float:quaternion[4],
        
    healtharmorweaponidspecialaction,
        
    Float:speed[3], Float:surfingoffsets[3],
        
    surfingvehidanimationidanimflags;

        
    BS_IgnoreBits(bs8); // packet id
        
    BS_ReadValue(bsRNM_UINT16lrkeys,
                         
    RNM_UINT16udkeys,
                         
    RNM_UINT16sampkeys,
                         
    RNM_FLOATpos[0],
                         
    RNM_FLOATpos[1],
                         
    RNM_FLOATpos[2],
                         
    RNM_FLOATquaternion[0],
                         
    RNM_FLOATquaternion[1],
                         
    RNM_FLOATquaternion[2],
                         
    RNM_FLOATquaternion[3],
                         
    RNM_UINT8health,
                         
    RNM_UINT8armor,
                         
    RNM_UINT8weaponid,
                         
    RNM_UINT8specialaction,
                         
    RNM_FLOATspeed[0],
                         
    RNM_FLOATspeed[1],
                         
    RNM_FLOATspeed[2],
                         
    RNM_FLOATsurfingoffsets[0],
                         
    RNM_FLOATsurfingoffsets[1],
                         
    RNM_FLOATsurfingoffsets[2],
                         
    RNM_UINT16surfingvehid,
                         
    RNM_INT16animationid,
                         
    RNM_INT16animflags);
    new 
    Floatdis GetPlayerDistanceFromPoint(playeridold_pos[0], old_pos[1], old_pos[2]);
    old_pos[0] = pos[0];
    old_pos[1] = pos[1];
    old_pos[2] = pos[2];

    Вот, в данном полном варианте dis всегда возвращает 0.0.

  4. #4
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Я правильно понял, вы делаете перехват пакетов с данными синхронизации? Если да, то коллбэк OnPlayerReceivedPacket должен срабатывать до того, как полученные данные будут обновлены и на сервере (и до вызова OnPlayerUpdate), поэтому GetPlayerPos, GetPlayerDistanceFromPoint и другие функции будут брать координаты игрока, которые были при предыдущем обновлении. Поэтому, как я и говорил ранее, вы вычисляете расстояние от точки до самой себя - ноль.

    Новые координаты игрока (полученные из перехваченного пакета) будут в массиве pos, поэтому если вы хотите вычислить расстояние, на которое игрок переместился после предыдущего обновления, нужно передавать в GetPlayerDistanceFromPoint ячейки массива pos, а не old_pos.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    20.01.2016
    Адрес
    GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
    Сообщений
    47
    Репутация:
    3 ±
    Цитата Сообщение от TBoPoIIIoK Посмотреть сообщение
    PHP код:
    public OnPlayerReceivedPacket(player_idpacket_idBitStream:bs)
    {
        if(
    packet_id == ID_PLAYER_SYNC)
        {
        new 
    lrkeysudkeyssampkeys,
        
    Float:pos[3], Float:quaternion[4],
        
    healtharmorweaponidspecialaction,
        
    Float:speed[3], Float:surfingoffsets[3],
        
    surfingvehidanimationidanimflags;

        
    BS_IgnoreBits(bs8); // packet id
        
    BS_ReadValue(bsRNM_UINT16lrkeys,
                         
    RNM_UINT16udkeys,
                         
    RNM_UINT16sampkeys,
                         
    RNM_FLOATpos[0],
                         
    RNM_FLOATpos[1],
                         
    RNM_FLOATpos[2],
                         
    RNM_FLOATquaternion[0],
                         
    RNM_FLOATquaternion[1],
                         
    RNM_FLOATquaternion[2],
                         
    RNM_FLOATquaternion[3],
                         
    RNM_UINT8health,
                         
    RNM_UINT8armor,
                         
    RNM_UINT8weaponid,
                         
    RNM_UINT8specialaction,
                         
    RNM_FLOATspeed[0],
                         
    RNM_FLOATspeed[1],
                         
    RNM_FLOATspeed[2],
                         
    RNM_FLOATsurfingoffsets[0],
                         
    RNM_FLOATsurfingoffsets[1],
                         
    RNM_FLOATsurfingoffsets[2],
                         
    RNM_UINT16surfingvehid,
                         
    RNM_INT16animationid,
                         
    RNM_INT16animflags);
    new 
    Floatdis GetPlayerDistanceFromPoint(playeridold_pos[0], old_pos[1], old_pos[2]);
    old_pos[0] = pos[0];
    old_pos[1] = pos[1];
    old_pos[2] = pos[2];

    Вот, в данном полном варианте dis всегда возвращает 0.0.
    Не знаю играет ли тут роль, но все же:

    public OnPlayerReceivedPacket(player_id, packet_id, BitStream:bs)
    GetPlayerDistanceFromPoint(playerid, old_pos[0], old_pos[1], old_pos[2]);

 

 

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

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

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

Ваши права

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