PDA

Просмотр полной версии : [Вопрос] Не могу понять как работать с SetPlayerCheckpoint



StevenH
08.05.2017, 00:26
Здравствуйте, кое в чем запутался! Подробнее.. Делаю систему поставок армии СФ в армию ЛВ с SAMP-RP. В чем суть...

Игрок садится в матолет (он же cargobob), прописывает /carm и ему на карте показывается чекпоинт на корабль, где загружаться. НО! Эту систему можно обойти, можно например в /gps выбрать ближайшее место, подлететь туда, и матолет ВСЕ РАВНО загрузится...

Как эту недоработку можно исправить, ведь при создании чекпоинта они не возвращают какого-то уникального айди (напримере CreateDynamicCP, чтобы потом в OnPlayerEnterDynamicCP сверять ид чекпоинта на какой игрок наступил)....

wAx
08.05.2017, 01:28
Здравствуйте, кое в чем запутался! Подробнее.. Делаю систему поставок армии СФ в армию ЛВ с SAMP-RP. В чем суть...

Игрок садится в матолет (он же cargobob), прописывает /carm и ему на карте показывается чекпоинт на корабль, где загружаться. НО! Эту систему можно обойти, можно например в /gps выбрать ближайшее место, подлететь туда, и матолет ВСЕ РАВНО загрузится...

Как эту недоработку можно исправить, ведь при создании чекпоинта они не возвращают какого-то уникального айди (напримере CreateDynamicCP, чтобы потом в OnPlayerEnterDynamicCP сверять ид чекпоинта на какой игрок наступил)....

проверять по координатам?

DeimoS
08.05.2017, 01:53
Или же вести этот самый ID самостоятельно, создав отдельный массив для этого и при создании каждого чекпоинта приравнивать массив к определённому значению, а когда чекпоинт взят - обнулять. Так можно определять, показан ли игроку чекпоинт или нет

StevenH
08.05.2017, 02:02
Или же вести этот самый ID самостоятельно, создав отдельный массив для этого и при создании каждого чекпоинта приравнивать массив к определённому значению, а когда чекпоинт взят - обнулять. Так можно определять, показан ли игроку чекпоинт или нет

Логику 50/50 уловил, днем попробую это реализовать, если я правильное имею представление...

StevenH
08.05.2017, 13:11
Или же вести этот самый ID самостоятельно, создав отдельный массив для этого и при создании каждого чекпоинта приравнивать массив к определённому значению, а когда чекпоинт взят - обнулять. Так можно определять, показан ли игроку чекпоинт или нет

Видимо я что то не уловил, пример можно?

DeimoS
08.05.2017, 13:42
new player_checkpint_id[MAX_PLAYERS];


public OnPlayerCommandText(playerid, cmdtext[])
{
if(!strcmp(cmdtext, "/showcp_1", false))
{
if(player_checkpint_id[playerid] != 0)
return SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF}Вам уже был показан один чекпоинт");
player_checkpint_id[playerid] = 1;
SetPlayerCheckpoint(...);
SendClientMessage(playerid, -1, "Показан чекпоинт №1");
return 1;
}
else if(!strcmp(cmdtext, "/showcp_2", false))
{
if(player_checkpint_id[playerid] != 0)
return SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF}Вам уже был показан один чекпоинт");
player_checkpint_id[playerid] = 2;
SetPlayerCheckpoint(...);
SendClientMessage(playerid, -1, "Показан чекпоинт №2");
return 1;
}
else if(!strcmp(cmdtext, "/showcp_3", false))
{
if(player_checkpint_id[playerid] != 0)
return SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF}Вам уже был показан один чекпоинт");
player_checkpint_id[playerid] = 3;
SetPlayerCheckpoint(...);
SendClientMessage(playerid, -1, "Показан чекпоинт №3");
return 1;
}
else if(!strcmp(cmdtext, "/hidecp", false))
{
if(player_checkpint_id[playerid] == 0)
return SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF}Вам не показан ни один чекпоинт");
player_checkpint_id[playerid] = 0;
DisablePlayerCheckpoint(playerid);
SendClientMessage(playerid, -1, "Чекпоинт скрыт");
return 1;
}
}


public OnPlayerEnterCheckpoint(playerid)
{
switch(player_checkpint_id[playerid])
{
case 0:
{
DisablePlayerCheckpoint(playerid);
SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF}Вам не был показан ни один чекпоинт");
}
case 1:
{
SendClientMessage(playerid, -1, "Вы взяли чекпоинт под №1");
DisablePlayerCheckpoint(playerid);
player_checkpint_id[playerid] = 0;
}
case 2:
{
SendClientMessage(playerid, -1, "Вы взяли чекпоинт под №2");
DisablePlayerCheckpoint(playerid);
player_checkpint_id[playerid] = 0;
}
case 3:
{
SendClientMessage(playerid, -1, "Вы взяли чекпоинт под №3");
SendClientMessage(playerid, -1, "Выйдите с него для его исчезновения");
}
}
}

public OnPlayerLeaveCheckpoint(playerid)
{
switch(player_checkpint_id[playerid])
{
case 3:
{
SendClientMessage(playerid, -1, "Вы вышли с чекпоинта под №3");
DisablePlayerCheckpoint(playerid);
player_checkpint_id[playerid] = 0;
}
}
}

Хотя удобнее будет написать свои аналоги функций, а-ля:

stock SetPlayerCheckpointEx(playerid, Float:x, Float:y, Float:z, Float:size, checkpointid)
{
if(checkpointid == 0)
return 0;
player_checkpint_id[playerid] = checkpointid;
return SetPlayerCheckpoint(playerid, x, y, z, size);
}

stock DisablePlayerCheckpointsForPlayer(playerid)
{
player_checkpint_id[playerid] = 0;
return DisablePlayerCheckpoint(playerid);
}

И уже использовать их для создания чекпоинтов

Mr.Forest
10.05.2017, 15:00
new player_checkpint_id[MAX_PLAYERS];


public OnPlayerCommandText(playerid, cmdtext[])
{
if(!strcmp(cmdtext, "/showcp_1", false))
{
if(player_checkpint_id[playerid] != 0)
return SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF}Вам уже был показан один чекпоинт");
player_checkpint_id[playerid] = 1;
SetPlayerCheckpoint(...);
SendClientMessage(playerid, -1, "Показан чекпоинт №1");
return 1;
}
else if(!strcmp(cmdtext, "/showcp_2", false))
{
if(player_checkpint_id[playerid] != 0)
return SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF}Вам уже был показан один чекпоинт");
player_checkpint_id[playerid] = 2;
SetPlayerCheckpoint(...);
SendClientMessage(playerid, -1, "Показан чекпоинт №2");
return 1;
}
else if(!strcmp(cmdtext, "/showcp_3", false))
{
if(player_checkpint_id[playerid] != 0)
return SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF}Вам уже был показан один чекпоинт");
player_checkpint_id[playerid] = 3;
SetPlayerCheckpoint(...);
SendClientMessage(playerid, -1, "Показан чекпоинт №3");
return 1;
}
else if(!strcmp(cmdtext, "/hidecp", false))
{
if(player_checkpint_id[playerid] == 0)
return SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF}Вам не показан ни один чекпоинт");
player_checkpint_id[playerid] = 0;
DisablePlayerCheckpoint(playerid);
SendClientMessage(playerid, -1, "Чекпоинт скрыт");
return 1;
}
}


public OnPlayerEnterCheckpoint(playerid)
{
switch(player_checkpint_id[playerid])
{
case 0:
{
DisablePlayerCheckpoint(playerid);
SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF}Вам не был показан ни один чекпоинт");
}
case 1:
{
SendClientMessage(playerid, -1, "Вы взяли чекпоинт под №1");
DisablePlayerCheckpoint(playerid);
player_checkpint_id[playerid] = 0;
}
case 2:
{
SendClientMessage(playerid, -1, "Вы взяли чекпоинт под №2");
DisablePlayerCheckpoint(playerid);
player_checkpint_id[playerid] = 0;
}
case 3:
{
SendClientMessage(playerid, -1, "Вы взяли чекпоинт под №3");
SendClientMessage(playerid, -1, "Выйдите с него для его исчезновения");
}
}
}

public OnPlayerLeaveCheckpoint(playerid)
{
switch(player_checkpint_id[playerid])
{
case 3:
{
SendClientMessage(playerid, -1, "Вы вышли с чекпоинта под №3");
DisablePlayerCheckpoint(playerid);
player_checkpint_id[playerid] = 0;
}
}
}

Хотя удобнее будет написать свои аналоги функций, а-ля:

stock SetPlayerCheckpointEx(playerid, Float:x, Float:y, Float:z, Float:size, checkpointid)
{
if(checkpointid == 0)
return 0;
player_checkpint_id[playerid] = checkpointid;
return SetPlayerCheckpoint(playerid, x, y, z, size);
}

stock DisablePlayerCheckpointsForPlayer(playerid)
{
player_checkpint_id[playerid] = 0;
return DisablePlayerCheckpoint(playerid);
}

И уже использовать их для создания чекпоинтов

Так а зачем? Есть же специальная функция в стримере:

CreateDynamicCP(Float:x, Float:y, Float:z, Float:size, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = STREAMER_CP_SD, STREAMER_TAG_AREA areaid = STREAMER_TAG_AREA -1, priority = 0);


И не придется выводить какие-то дополнительные массивы с волшебными цифрами, достаточно будет просто использовать

OnPlayerEnterDynamicCP(playerid, STREAMER_TAG_CP checkpointid);

DeimoS
10.05.2017, 18:10
Так а зачем? Есть же специальная функция в стримере:

CreateDynamicCP(Float:x, Float:y, Float:z, Float:size, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = STREAMER_CP_SD, STREAMER_TAG_AREA areaid = STREAMER_TAG_AREA -1, priority = 0);


И не придется выводить какие-то дополнительные массивы с волшебными цифрами, достаточно будет просто использовать

OnPlayerEnterDynamicCP(playerid, STREAMER_TAG_CP checkpointid);

Автор темы не спрашивал какие есть варианты раоты с чекпоинтами. Он спросил как можно отслеживать какой из чекпоинтов, показанный через SetPlayerCheckpoint, показан игроку.
Да и разницы, по сути, никакой нет, кроме того, что в стримере можно сразу несколько чекпоинтов показывать. Общий принцип и у стримера, и у моей реализации одинаков.