PDA

Просмотр полной версии : [Вопрос] GetPlayerDistanceFromPoint, баг



TBoPoIIIoK
12.08.2016, 11:57
Собственно столкнулся с багом в GetPlayerDistanceFromPoint. Приведу пару примеров..

1. не работающий случай

// некоторый код который тут не нужен
new Float: dis = GetPlayerDistanceFromPoint(playerid, old_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. работающий случай

// некоторый код который тут не нужен
new Float: dis = GetPlayerDistanceFromPoint(playerid, old_pos[0], old_pos[1], old_pos[2]);
GetPlayerPos(playerid, old_pos[0], old_pos[1], old_pos[2]);
В итоге все хорошо и dis вернет все что надо.

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

Daniel_Cortez
12.08.2016, 16:26
столкнулся с багом в GetPlayerDistanceFromPoint
Прежде, чем делать такие выводы, сперва научитесь пользоваться той функцией.




1. не работающий случай

// некоторый код который тут не нужен
new Float: dis = GetPlayerDistanceFromPoint(playerid, old_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. работающий случай

// некоторый код который тут не нужен
new Float: dis = GetPlayerDistanceFromPoint(playerid, old_pos[0], old_pos[1], old_pos[2]);
GetPlayerPos(playerid, old_pos[0], old_pos[1], old_pos[2]);
В итоге все хорошо и dis вернет все что надо.

В обоих случаях функция GetPlayerDistanceFromPoint используется одинаково: аргументы передаются одни и те же, а результат записывается в ту же самую переменную.
Точно причину разных значений в dis назвать сложно (ещё меньше кода не могли показать?), но ясно, что дело в вашем коде до или после вызова той функции.



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


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

TBoPoIIIoK
12.08.2016, 16:29
public OnPlayerReceivedPacket(player_id, packet_id, BitStream:bs)
{
if(packet_id == ID_PLAYER_SYNC)
{
new lrkeys, udkeys, sampkeys,
Float:pos[3], Float:quaternion[4],
health, armor, weaponid, specialaction,
Float:speed[3], Float:surfingoffsets[3],
surfingvehid, animationid, animflags;

BS_IgnoreBits(bs, 8); // packet id
BS_ReadValue(bs, RNM_UINT16, lrkeys,
RNM_UINT16, udkeys,
RNM_UINT16, sampkeys,
RNM_FLOAT, pos[0],
RNM_FLOAT, pos[1],
RNM_FLOAT, pos[2],
RNM_FLOAT, quaternion[0],
RNM_FLOAT, quaternion[1],
RNM_FLOAT, quaternion[2],
RNM_FLOAT, quaternion[3],
RNM_UINT8, health,
RNM_UINT8, armor,
RNM_UINT8, weaponid,
RNM_UINT8, specialaction,
RNM_FLOAT, speed[0],
RNM_FLOAT, speed[1],
RNM_FLOAT, speed[2],
RNM_FLOAT, surfingoffsets[0],
RNM_FLOAT, surfingoffsets[1],
RNM_FLOAT, surfingoffsets[2],
RNM_UINT16, surfingvehid,
RNM_INT16, animationid,
RNM_INT16, animflags);
new Float: dis = GetPlayerDistanceFromPoint(playerid, old_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.

Daniel_Cortez
13.08.2016, 01:13
Я правильно понял, вы делаете перехват пакетов с данными синхронизации? Если да, то коллбэк OnPlayerReceivedPacket должен срабатывать до того, как полученные данные будут обновлены и на сервере (и до вызова OnPlayerUpdate), поэтому GetPlayerPos, GetPlayerDistanceFromPoint и другие функции будут брать координаты игрока, которые были при предыдущем обновлении. Поэтому, как я и говорил ранее, вы вычисляете расстояние от точки до самой себя - ноль.

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

Processing
15.08.2016, 15:24
public OnPlayerReceivedPacket(player_id, packet_id, BitStream:bs)
{
if(packet_id == ID_PLAYER_SYNC)
{
new lrkeys, udkeys, sampkeys,
Float:pos[3], Float:quaternion[4],
health, armor, weaponid, specialaction,
Float:speed[3], Float:surfingoffsets[3],
surfingvehid, animationid, animflags;

BS_IgnoreBits(bs, 8); // packet id
BS_ReadValue(bs, RNM_UINT16, lrkeys,
RNM_UINT16, udkeys,
RNM_UINT16, sampkeys,
RNM_FLOAT, pos[0],
RNM_FLOAT, pos[1],
RNM_FLOAT, pos[2],
RNM_FLOAT, quaternion[0],
RNM_FLOAT, quaternion[1],
RNM_FLOAT, quaternion[2],
RNM_FLOAT, quaternion[3],
RNM_UINT8, health,
RNM_UINT8, armor,
RNM_UINT8, weaponid,
RNM_UINT8, specialaction,
RNM_FLOAT, speed[0],
RNM_FLOAT, speed[1],
RNM_FLOAT, speed[2],
RNM_FLOAT, surfingoffsets[0],
RNM_FLOAT, surfingoffsets[1],
RNM_FLOAT, surfingoffsets[2],
RNM_UINT16, surfingvehid,
RNM_INT16, animationid,
RNM_INT16, animflags);
new Float: dis = GetPlayerDistanceFromPoint(playerid, old_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]);