PDA

Просмотр полной версии : [Вопрос] Вычислить ближайшую точку



Jackal
26.08.2015, 09:19
Задача: После смерти персонажа - спавн в ближайшей больнице.

Если умер у любой из 7 точек кроме самой первой (верхней), то когда умираешь в месте, где ближайшая точка первая - спавнит на любой из 6 точек, где умирал в предпоследний раз.

При включении мода, 1я строка координат работает, до тех пор пока не попробовать на любую другую координату не заспавнится.
Дальше если умирать у 1й области, на неё не спавнит как должно, а спавнит на предпоследнюю любую из 6ти.



new Float: Deathposx[MAX_PLAYERS];
new Float: Deathposy[MAX_PLAYERS];
new Float: Deathposz[MAX_PLAYERS];

new Float:StationPos[][] =
{
{1863.7524,-1931.4460,4.9223,281.3866},// - эту строку перебивают нижние строки координат.
{2484.0522,-239.5500,5.8655,87.8277},
{1115.3075,-1420.5315,7.5683,268.5078},
{1176.9838,191.8112,6.8687,358.2674},
{-203.7157,1202.7660,14.9085,87.3823},
{-1167.3390,1781.3202,16.1761,177.9131},
{-2599.4739,1661.1277,58.9695,89.2162}
};
enum StationPosInfo
{
Float:Position[3],
StationId
};
new StantionInfo[StationPosInfo];


stock DistancePointToPoint(Float: x, Float: y, Float: z, Float: fx, Float:fy, Float: fz) return floatround(floatsqroot(floatpower(fx - x, 2) + floatpower(fy - y, 2) + floatpower(fz - z, 2)));


public OnPlayerDeath(playerid, killerid, reason)
{
GetPlayerPos(playerid, Deathposx[playerid], Deathposy[playerid], Deathposz[playerid]);//Когда умер, записываем координаты персонажа в переменные
return 1;
}

stock ToHospital(playerid)//Здесь рассчитываем ближайшую точку больницы к месту, где умер персонаж.
{
if(PlayerInfo[playerid][pInterior] == 0)
{
StantionInfo[Position][0] = DistancePointToPoint(Deathposx[playerid], Deathposy[playerid], Deathposz[playerid], StationPos[0][0], StationPos[0][1], StationPos[0][2]);
for(new i; i < sizeof(StationPos); ++i)
{
if(StantionInfo[Position][0] <= (StantionInfo[Position][1] = DistancePointToPoint(Deathposx[playerid], Deathposy[playerid], Deathposz[playerid], StationPos[i][0], StationPos[i][1], StationPos[i][2]))) continue;
StantionInfo[Position][0] = StantionInfo[Position][1];
StantionInfo[StationId] = i;
}
SetPlayerPos(playerid, StationPos[StantionInfo[StationId]][0], StationPos[StantionInfo[StationId]][1], StationPos[StantionInfo[StationId]][2]);
SetPlayerFacingAngle(playerid, StationPos[StantionInfo[StationId]][3]);
SetCameraBehindPlayer(playerid);
SetPlayerInterior(playerid, 0);
SetPlayerVirtualWorld(playerid, 0);
}
}

Daniel_Cortez
26.08.2015, 15:47
Вот простейший пример поиска минимального значения в массиве. Надеюсь, под свою задачу сможете адаптировать.


new Float:arr[10];

new Float:min = arr[0];
for (new i = 1; i < sizeof(arr); ++i)
if(min > arr[i])
arr[i] = min;