Re: W_Points -
AirKite - 05.04.2013
Кстати, а что будет если точка находится с краю чанка, но её радиус выходит за пределы этого чанка. Сработает ли она на соседнем чанке?
UPD: стало так интересно, что не выдержал и порылся немного в коде. Как я понял, ищет ещё и в окружных, 8 чанках. Лучше всего при создании поинта проверять на какие чанки попадает его радиус, и в эти чанки добавлять информацию о чанках в которые и попадают поинты а-ля ярлыки. (В pawn скорее извращение, а вот в плагине можно... хотя если использовать GVar плагин, то вполне).
Далее не понял зачем в GetPlayerPoint второй аргумент. Так называемый MODE.
pawn Code:
if(WorldID != PointW[P] || PointW[P]!=-1)continue;
// В чём разница? Смысли, один метод будет всегда быстрее или на ровне другого, с итоговым всегда одинаковым результатом.
// И с каких пор виртуальный мир может быть -1? Разве недостаточно WorldID != PointW[P]?
if(WorldID != PointW[P] && PointW[P]!=-1)continue;
// 1 метод
if(IsPlayerInRangeOfPoint(playerid, PointR[P], PointX[P], PointY[P], PointZ[P]))return P;
// 2 метод
y=GetPlayerDistanceFromPoint(playerid, PointX[P], PointY[P], PointZ[P]);
if(y < z) // выше z=1000.0;
{
z=y; P2=P;
}
// 3 метод
y=GetPlayerDistanceFromPoint(playerid, PointX[P], PointY[P], PointZ[P]);
if(y > PointR[P])continue;
if(y < z)
{
z=y; P2=P;
}
// Так и не понял зачем присваивать радиус "z" когда она далее нигде не используется и никуда не возвращается.
// Про сами методы, получение дистанции заместо IsPlayerInRangeOfPoint я вообще нихрена не понимаю. ЗАЧЕМ???
Re: W_Points -
White_116 - 05.04.2013
Quote:
Originally Posted by AirKite
Кстати, а что будет если точка находится с краю чанка, но её радиус выходит за пределы этого чанка. Сработает ли она на соседнем чанке?
|
Да, для этого я и проверяю окружные 8 чанков. Чанк в котором находится игрок, и те чанки что находятся вокруг первого. Правда если радиус превышает 2 чанка то не сработает! Просто не думаю что радиус будет больше 100.
Quote:
Originally Posted by AirKite
Лучше всего при создании поинта проверять на какие чанки попадает его радиус, и в эти чанки добавлять информацию о чанках в которые и попадают поинты а-ля ярлыки. (В pawn скорее извращение, а вот в плагине можно... хотя если использовать GVar плагин, то вполне).
|
Можно, и оно исправляет выше описаную проблему, но при добавление точки нужно искать эти самые чанки, хотя скорость обработки станет максимально возможной, так как достаточно лишь найти чанк в котором стоит игрок.

Это реально хорошое замечание и идея!
Quote:
Originally Posted by AirKite
Далее не понял зачем в GetPlayerPoint второй аргумент. Так называемый MODE.
pawn Code:
if(WorldID != PointW[P] || PointW[P]!=-1)continue; // В чём разница? Смысли, один метод будет всегда быстрее или на ровне другого, с итоговым всегда одинаковым результатом. // И с каких пор виртуальный мир может быть -1? Разве недостаточно WorldID != PointW[P]? if(WorldID != PointW[P] && PointW[P]!=-1)continue;
// 1 метод if(IsPlayerInRangeOfPoint(playerid, PointR[P], PointX[P], PointY[P], PointZ[P]))return P; // 2 метод y=GetPlayerDistanceFromPoint(playerid, PointX[P], PointY[P], PointZ[P]); if(y < z) // выше z=1000.0; { z=y; P2=P; } // 3 метод y=GetPlayerDistanceFromPoint(playerid, PointX[P], PointY[P], PointZ[P]); if(y > PointR[P])continue; if(y < z) { z=y; P2=P; } // Так и не понял зачем присваивать радиус "z" когда она далее нигде не используется и никуда не возвращается. // Про сами методы, получение дистанции заместо IsPlayerInRangeOfPoint я вообще нихрена не понимаю. ЗАЧЕМ???
|
GetPlayerPoint(playerid, 0); Ищет самую близлежащую точку в которой находится игрок.
GetPlayerPoint(playerid, 1); Ищет самую близлежащую точку даже если игрок не находится в ней.
GetPlayerPoint(playerid, 2); Ищет до первой точки в которой находится игрок.
Quote:
Originally Posted by AirKite
// И с каких пор виртуальный мир может быть -1? Разве недостаточно WorldID != PointW[P]?
if(WorldID != PointW[P] && PointW[P]!=-1)continue;
|
Вы не правильно поняли, PointW[P]!=-1 означает что точка находится во всех вирт мирах а не в определённом.
первая проверка как раз и рассматривает. Если точка в другом мире а игрок в другом, и если точка не относится ко всем мирам то, игрок не может находится в точке.
Re: W_Points -
AirKite - 05.04.2013
Понял, отстал... Касательно
Quote:
Так и не понял зачем присваивать радиус "z" когда она далее нигде не используется
|
Сам тупанул, забыв о цикле.
Quote:
Originally Posted by White_116
GetPlayerPoint(playerid, 2); Ищет до первой точки в которой находится игрок.
|
Разве не GetPlayerPoint(playerid, 0); ?
Я кстати что то упустил в первом топике, или там нет описания методов для GetPlayerPoint?
Re: W_Points -
White_116 - 05.04.2013
Есть и было с выходом 2.0, под основными функциями.
Quote:
Разве не GetPlayerPoint(playerid, 0); ?
|
Нет, в коде 2,1,0. Самый быстрый, средний, медленный.
Все естественно будут юзать самый быстрый вариант, вот третий(mode = 2) метод на первом месте в коде.
UPD:
Попробовал создать с рассортировкой при создании точки. Есть не приятный момент: если радиус большой, то центр точки не соответствует центру чанка, из за этого если двигаться по окружности точки, то могут не войти те чанки которые есть у окружности чанка в которой расположена точка. Рассчитать всё это можно, но опять таки поменяем шило на мыло.
Re: W_Points -
AirKite - 06.04.2013
Quote:
Originally Posted by White_116
Попробовал создать с рассортировкой при создании точки. Есть не приятный момент: если радиус большой, то центр точки не соответствует центру чанка, из за этого если двигаться по окружности точки, то могут не войти те чанки которые есть у окружности чанка в которой расположена точка. Рассчитать всё это можно, но опять таки поменяем шило на мыло.
|
Что там рассчитывать то? Всё равно должно быть быстрей. Даже если брать разброс радиуса от краёв чанка. Тупо делить излишний радиус на площадь чанка, подсчитав количество чанков, закинуть в них ярлыки.
Ещё лучше рассчитать позицию относительно чанка, и геометрию покрытия других чанков. В противном случае нужно запретить больший радиус, пропорционально заданному размеру чанка. А так конечно больших радиусов много быть не должно, в противном случае проще использовать ещё одни чанки большего размера или не использовать их вовсе.
Re: W_Points -
White_116 - 06.04.2013
Quote:
Originally Posted by AirKite
Ещё лучше рассчитать позицию относительно чанка, и геометрию покрытия других чанков.
|
Я это и пытался делать.
Re: W_Points -
White_116 - 15.05.2013
Всем печеньки. Новая версия по новому методу. Прирост скорости в 3 раз относительно теста.
Re: W_Points -
AirKite - 24.05.2013
Похвала, хоть и код ещё пока не смотрел, не сомневаюсь в его чистоте...
Противоположное конечно также исключать нельзя в любом случае, поэтому как будет время, код гляну
Re: W_Points -
PT - 08.08.2013
очень хороший, поздравления