Просмотр полной версии : [Вопрос] Не могу понять как работать с SetPlayerCheckpoint
Здравствуйте, кое в чем запутался! Подробнее.. Делаю систему поставок армии СФ в армию ЛВ с SAMP-RP. В чем суть...
Игрок садится в матолет (он же cargobob), прописывает /carm и ему на карте показывается чекпоинт на корабль, где загружаться. НО! Эту систему можно обойти, можно например в /gps выбрать ближайшее место, подлететь туда, и матолет ВСЕ РАВНО загрузится...
Как эту недоработку можно исправить, ведь при создании чекпоинта они не возвращают какого-то уникального айди (напримере CreateDynamicCP, чтобы потом в OnPlayerEnterDynamicCP сверять ид чекпоинта на какой игрок наступил)....
Здравствуйте, кое в чем запутался! Подробнее.. Делаю систему поставок армии СФ в армию ЛВ с SAMP-RP. В чем суть...
Игрок садится в матолет (он же cargobob), прописывает /carm и ему на карте показывается чекпоинт на корабль, где загружаться. НО! Эту систему можно обойти, можно например в /gps выбрать ближайшее место, подлететь туда, и матолет ВСЕ РАВНО загрузится...
Как эту недоработку можно исправить, ведь при создании чекпоинта они не возвращают какого-то уникального айди (напримере CreateDynamicCP, чтобы потом в OnPlayerEnterDynamicCP сверять ид чекпоинта на какой игрок наступил)....
проверять по координатам?
Или же вести этот самый ID самостоятельно, создав отдельный массив для этого и при создании каждого чекпоинта приравнивать массив к определённому значению, а когда чекпоинт взят - обнулять. Так можно определять, показан ли игроку чекпоинт или нет
Или же вести этот самый ID самостоятельно, создав отдельный массив для этого и при создании каждого чекпоинта приравнивать массив к определённому значению, а когда чекпоинт взят - обнулять. Так можно определять, показан ли игроку чекпоинт или нет
Логику 50/50 уловил, днем попробую это реализовать, если я правильное имею представление...
Или же вести этот самый ID самостоятельно, создав отдельный массив для этого и при создании каждого чекпоинта приравнивать массив к определённому значению, а когда чекпоинт взят - обнулять. Так можно определять, показан ли игроку чекпоинт или нет
Видимо я что то не уловил, пример можно?
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);
Так а зачем? Есть же специальная функция в стримере:
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, показан игроку.
Да и разницы, по сути, никакой нет, кроме того, что в стримере можно сразу несколько чекпоинтов показывать. Общий принцип и у стримера, и у моей реализации одинаков.
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot