Merlin
Умник
Здравствуйте дорогие пользователи форума pawno-info.ru Мне хотелось вы вам рассказать о такой ф-ции как GetXYInFrontOfPlayer. Возможно вы видели ее под другими названиями но это не суть.
Вот сама ф-ция. Ее нужно вставить ко всем stock, будь то гейммод или фс.
Вот сама ф-ция. Ее нужно вставить ко всем stock, будь то гейммод или фс.
PHP:
stock GetXYInFrontOfPlayer(playerid, &Float:x, &Float:y, Float:distance)
{ //получить координаты перед игроком
new Float:z, Float:angle;
GetPlayerPos(playerid, x, y, z);
GetPlayerFacingAngle(playerid, angle);
x += (distance * floatsin(-angle, degrees));
y += (distance * floatcos(-angle, degrees));
}
Как видно из комментария, эта ф-ция получает координаты перед игроком, однако, если выставить отрицательные значения Float:distance можно получить координаты и за игроком. А если немного переделать ф-цию, можно получить позицию и перед/за машиной. Думаю не помешало бы вам показать это.
Для начала заменим вот это GetPlayerPos(playerid, x, y, z); на вот это GetVehiclePos(vehicleid, x, y, z);. Описания этих и не только ф-ций вы можете найти на этом форуме. Продолжим... Теперь мы имеем вот это:
Для начала заменим вот это GetPlayerPos(playerid, x, y, z); на вот это GetVehiclePos(vehicleid, x, y, z);. Описания этих и не только ф-ций вы можете найти на этом форуме. Продолжим... Теперь мы имеем вот это:
PHP:
stock GetXYInFrontOfPlayer(playerid, &Float:x, &Float:y, Float:distance)
{ //получить координаты перед игроком
new Float:z, Float:angle;
GetVehiclePos(vehicleid, x, y, z);
GetPlayerFacingAngle(playerid, angle);
x += (distance * floatsin(-angle, degrees));
y += (distance * floatcos(-angle, degrees));
}
Однако это еще не все. Заменим GetPlayerFacingAngle(playerid, angle); на вот такую ф-цию GetVehicleZAngle(vehicleid, angle);. В общем то все. Теперь мы имеем вот это:
PHP:
stock GetXYInFrontOfVehicle(vehicleid, &Float:x, &Float:y, Float:distance)
{ //получить координаты перед машной
new Float:z, Float:angle;
GetVehiclePos(vehicleid, x, y, z);
GetVehicleZAngle(vehicleid, angle);
x += (distance * floatsin(-angle, degrees));
y += (distance * floatcos(-angle, degrees));
}
Именно эту ф-цию я использовал при разработке профессии Водителя мусоровоза, которую вы можете увидеть на сервере Life Simulator(IP:93.84.118.82:7700).
Однако мы будем в примере рассматривать первую ф-цию, т.е. GetXYInFrontOfPlayer.
Итак, давайте создадим команду, при которой перед нами создастся Pickup, а при заходе на него нам бы писало:"Привет [Ну и тут ник]".
Для начала создадим переменную для пикапа, пускай она будет называться HeyApple;
Однако мы будем в примере рассматривать первую ф-цию, т.е. GetXYInFrontOfPlayer.
Итак, давайте создадим команду, при которой перед нами создастся Pickup, а при заходе на него нам бы писало:"Привет [Ну и тут ник]".
Для начала создадим переменную для пикапа, пускай она будет называться HeyApple;
PHP:
new HeyApple;
- Мы задали переменную с названием "HeyApple". Это нужно поместить после всех #include.
Теперь перейдем к public OnPlayerCommandText(playerid, cmdtext[]) - Тут происходят все действия с командами.
На след. строке после { пишем
Теперь перейдем к public OnPlayerCommandText(playerid, cmdtext[]) - Тут происходят все действия с командами.
На след. строке после { пишем
PHP:
if (strcmp("/heypickup", cmdtext, true, 10) == 0)
{
}
По сути это означает, что при введении в чат /heypickup произойдет какое-либо действие.
Я уже описывал как добавить ф-цию GetXYInFrontOfPlayer в работу, так что еще раз делать я этого не буду.
Создадим 3 переменные типа Float:
Я уже описывал как добавить ф-цию GetXYInFrontOfPlayer в работу, так что еще раз делать я этого не буду.
Создадим 3 переменные типа Float:
PHP:
if (strcmp("/heypickup", cmdtext, true, 10) == 0)
{
new Float:X,Float:Y,Float:Z;
}
Теперь запишем текущую позицию X, Y, Z в X, Y, Z соответственно.
PHP:
if (strcmp("/heypickup", cmdtext, true, 10) == 0)
{
new Float:X,Float:Y,Float:Z;
GetPlayerPos(playerid, X, Y, Z);
}
Теперь применим нашу ф-цию GetXYInFrontOfPlayer.
PHP:
if (strcmp("/heypickup", cmdtext, true, 10) == 0)
{
new Float:X,Float:Y,Float:Z;
GetPlayerPos(playerid, X, Y, Z);
GetXYInFrontOfPlayer(playerid, X, Y, 3.0);
}
Т.е. мы узнали координату на 3.0 метра перед игроком.
Ну и осталось только создать сам Pickup.
Ну и осталось только создать сам Pickup.
PHP:
if (strcmp("/heypickup", cmdtext, true, 10) == 0)
{
new Float:X,Float:Y,Float:Z;
GetPlayerPos(playerid, X, Y, Z);
GetXYInFrontOfPlayer(playerid, X, Y, 3.0);
HeyApple = CreatePickup(1239, 1, X, Y, Z, -1);
}
И давайте еще добавим вот такую проверку. Это поможет нам избежать непредвиденные ситуации:
PHP:
if (strcmp("/heypickup", cmdtext, true, 10) == 0)
{
if(HeyApple != 0) return SendClientMessage(playerid, COLOR_GREY, " Пикап уже размещен!");
new Float:X,Float:Y,Float:Z;
GetPlayerPos(playerid, X, Y, Z);
GetXYInFrontOfPlayer(playerid, X, Y, 3.0);
HeyApple = CreatePickup(1239, 1, X, Y, Z, -1);
return 1;
}
Теперь давайте допишем действия при подъеме пикапа в public OnPlayerPickUpPickup. Описывать каждую ф-цию я не буду, т.к. урок посвящен не этому.
PHP:
if (pickupid == HeyApple)
{
new string[256];
new name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, sizeof(name));
format(string, sizeof(string), "Привет %s ", name);
SendClientMessageToAll(0xFF6600FF, string);
DestroyPickup(HeyApple);
return 1;
}
И давайте наверное добавим команду удаления Pickup, на всякий случай.
PHP:
if (strcmp("/pickupdelete", cmdtext, true, 10) == 0)
{
DestroyPickup(HeyApple);
return 1;
}
Ну и в общем то все. С вами был Merlin, спасибо за внимание. Надеюсь вам этот урок был полезен.
Последнее редактирование модератором:
