[Include] W_Points
#21

Кстати, а что будет если точка находится с краю чанка, но её радиус выходит за пределы этого чанка. Сработает ли она на соседнем чанке?

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 я вообще нихрена не понимаю. ЗАЧЕМ???
Reply
#22

Quote:
Originally Posted by AirKite
View Post
Кстати, а что будет если точка находится с краю чанка, но её радиус выходит за пределы этого чанка. Сработает ли она на соседнем чанке?
Да, для этого я и проверяю окружные 8 чанков. Чанк в котором находится игрок, и те чанки что находятся вокруг первого. Правда если радиус превышает 2 чанка то не сработает! Просто не думаю что радиус будет больше 100.

Quote:
Originally Posted by AirKite
View Post
Лучше всего при создании поинта проверять на какие чанки попадает его радиус, и в эти чанки добавлять информацию о чанках в которые и попадают поинты а-ля ярлыки. (В pawn скорее извращение, а вот в плагине можно... хотя если использовать GVar плагин, то вполне).
Можно, и оно исправляет выше описаную проблему, но при добавление точки нужно искать эти самые чанки, хотя скорость обработки станет максимально возможной, так как достаточно лишь найти чанк в котором стоит игрок. Это реально хорошое замечание и идея!
Quote:
Originally Posted by AirKite
View Post
Далее не понял зачем в 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
View Post
// И с каких пор виртуальный мир может быть -1? Разве недостаточно WorldID != PointW[P]?
if(WorldID != PointW[P] && PointW[P]!=-1)continue;
Вы не правильно поняли, PointW[P]!=-1 означает что точка находится во всех вирт мирах а не в определённом.
первая проверка как раз и рассматривает. Если точка в другом мире а игрок в другом, и если точка не относится ко всем мирам то, игрок не может находится в точке.
Reply
#23

Понял, отстал... Касательно
Quote:

Так и не понял зачем присваивать радиус "z" когда она далее нигде не используется

Сам тупанул, забыв о цикле.
Quote:
Originally Posted by White_116
View Post
GetPlayerPoint(playerid, 2); Ищет до первой точки в которой находится игрок.
Разве не GetPlayerPoint(playerid, 0); ?

Я кстати что то упустил в первом топике, или там нет описания методов для GetPlayerPoint?
Reply
#24

Есть и было с выходом 2.0, под основными функциями.
Quote:

Разве не GetPlayerPoint(playerid, 0); ?

Нет, в коде 2,1,0. Самый быстрый, средний, медленный.
Все естественно будут юзать самый быстрый вариант, вот третий(mode = 2) метод на первом месте в коде.
UPD:
Попробовал создать с рассортировкой при создании точки. Есть не приятный момент: если радиус большой, то центр точки не соответствует центру чанка, из за этого если двигаться по окружности точки, то могут не войти те чанки которые есть у окружности чанка в которой расположена точка. Рассчитать всё это можно, но опять таки поменяем шило на мыло.
Reply
#25

Quote:
Originally Posted by White_116
View Post
Попробовал создать с рассортировкой при создании точки. Есть не приятный момент: если радиус большой, то центр точки не соответствует центру чанка, из за этого если двигаться по окружности точки, то могут не войти те чанки которые есть у окружности чанка в которой расположена точка. Рассчитать всё это можно, но опять таки поменяем шило на мыло.
Что там рассчитывать то? Всё равно должно быть быстрей. Даже если брать разброс радиуса от краёв чанка. Тупо делить излишний радиус на площадь чанка, подсчитав количество чанков, закинуть в них ярлыки.

Ещё лучше рассчитать позицию относительно чанка, и геометрию покрытия других чанков. В противном случае нужно запретить больший радиус, пропорционально заданному размеру чанка. А так конечно больших радиусов много быть не должно, в противном случае проще использовать ещё одни чанки большего размера или не использовать их вовсе.
Reply
#26

Quote:
Originally Posted by AirKite
View Post
Ещё лучше рассчитать позицию относительно чанка, и геометрию покрытия других чанков.
Я это и пытался делать.
Reply
#27

Всем печеньки. Новая версия по новому методу. Прирост скорости в 3 раз относительно теста.
Reply
#28

Похвала, хоть и код ещё пока не смотрел, не сомневаюсь в его чистоте...
Противоположное конечно также исключать нельзя в любом случае, поэтому как будет время, код гляну
Reply
#29

очень хороший, поздравления
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)