Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Урок Проверка на нахождение игрока в некоторой зоне.

Статус
В этой теме нельзя размещать новые ответы.

iBublik

Пользователь
Сложность: Легко
Примечание: Данный урок направлен к новичкам, которые только начинают осваиваться.

Привет, дорогой друг.
Я думаю, что иногда ты задумывался, как сделать ту или иную систему, где можно будет определить, стоит игрок в определенной зоне, или нет?
Примерами таких систем может быть ДМ зона, погода в разных городах и к тому же, всеми любимые GangZones.
А сейчас, пожалуйста, напрягись и вчитайся в то, что здесь написано, дабы понять и повысить свое умение программировать (если, конечно, ты не работаешь по принципу копи-паста).

Теория:

В программировании никуда без логики, я надеюсь, что ты знаешь это, дружок. И для того, чтобы понять, что сейчас мы будем делать, я попытаюсь тебе подробно объяснить, как этот система будет работать.

Ты знаешь, что такое координаты? Надеюсь знаешь, потому что сейчас все будет построено на них. В Grand Theft Auto каждый объект имеет свою координату.

А теперь, дружок, если ты не копипастишь и имеешь благородную цель обучиться, то давай сейчас порассуждаем. Представим ситуацию: нам нужно, чтобы когда игрок входил на территорию Зоны 69 (если ты часто играешь на РП серверах, то это Зона 51), проигрывался какой-либо звук, или появлялось сообщение, мол "Вы находитесь в запретной зоне. Покиньте или вам п#&...". Как же нам это сделать?



На картинке здесь я выделил необходимую нам зону. А сейчас посмотри на карту и пораскинь мозгами, не читай дальше, что будем делать?

Подумал? А теперь проверяй свое суждение. Для того, чтобы оповещать игрока, нам нужно будет написать проверку, находится ли игрок в зоне этого квадрата.
Как же мы это будем делать?



Посмотри теперь внимательно на эту картинку. Представь, что эти кружочки - игроки. Один находится в квадрате, другой нет. Каждый имеет свою координату.
Ты не догадываешься еще, что нужно делать? Если еще не догадался, либо не опустился ниже, чтобы увидеть наконец код, то я тебе расскажу. Нам нужно проверять координаты игрока.
И чтобы это сделать, мы будем брать 2 координаты углов этого желтого квадратика. Эти углы будут верхний левый и нижний правый.

А как проверять будем? Просто. Теория GTA гласит так, что если человек движется влево, что его X-координата уменьшается, а если человек движется вверх, то его Y-координата увеличивается. (Можно я не буду писать, что будет, если двигаться в противоположном направлении? Ты же явно не глупый, догадаешься.) Поэтому нам нужно проверять координаты игрока с координатами двух углов квадрата. Игрок должен быть правее и ниже верхнего угла, но левее и выше правого нижнего угла.

Отлично! Мы с тобой поняли, как нам нужно это сделать, а теперь перейдем к самому коду. (Неужели, да?)

Код:

Для упрощения мы создадим новый паблик (если ты не собираешься использовать этот код один раз):
В начало своего мода введи:
Код:
forward IsPlayerInArea(playerid,Float:minx,Float:miny,Float:maxx,Float:maxy);

Что означают эта последовательность символов:
  • playerid - мы будем использовать ее для ID игрока (кто бы мог подумать?)
  • Float:minx,Float:miny - это координаты верхнего левого угла зоны.
  • Float:maxx,Float:maxy - это координаты нижнего правого угла зоны

Далее в конец этот код:
Код:
public IsPlayerInArea(playerid,Float:minx,Float:miny,Float:maxx,Float:maxy) {
        new Float:X,Float:Z,Float:Y;
        GetPlayerPos(playerid,X,Y,Z);
        if(X > minx && X < maxx && Y > miny && maxy > Y) return 1;
        return 0;
}

Я тоже, пожалуй, объясню, что за что отвечает:

Код:
new Float:X,Float:Z,Float:Y;
GetPlayerPos(playerid,X,Y,Z);
Это нам нужно для того, чтобы получить координаты игрока.
Код:
if(X > minx && X < maxx && Y > miny && maxy > Y) return 1;
return 0;
А это нам нам нужно для того, чтобы узнать, находится ли игрок в квадрате?
  • X > minx && X < maxx - Находится ли X-координата правее верхнего левого угла и левее нижнего правого угла
  • Y > miny && maxy > Y - Находится ли Y-координата выше нижнего правого угла и ниже верхнего левого угла



В принципе вот такой вот простой код.
Пример использования:
Код:
if(IsPlayerInArea(playerid,46.875,1769.53125,351.5625,2118.1640625)) SendClientMessage(playerid,-1,"Ты на территории Зоны 69!");

Я надеюсь, ты что-то понял из данного урока, либо нашел тот код, который тебе был нужен.

Кстати, для удобства разметки зон можно использовать программу GangZone Maker:
VirusTotal:
Ссылка на скачивание:


P.S. Извиняюсь, если слишком много текста, но это ведь урок, а не готовый код, не так ли? :)
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу