Создание движущихся ворот

32 posts in this topic

Guest stibs
Новичок

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

Думаю, можно начинать. 

Для начала создадим переменную самих ворот, с которыми будем работать. 

Ко всем new:

new gate,
    vorotaopen;

Теперь следуем в паблик OnGameModeInit. Туда вставляем следующее

gate = CreateObject(980, 1798.16, 2951.23, 23.5, 0, 0, 0); 
/* Поясняю: gate = - присваиваем переменно gate ид нашего объекта, который и будем двигать. 
	CreateObject - функция создания объекта.
    980 - ид объекта (ворот), можете заменить на свой
    1798.16, 2951.23, 23.5 - координаты X, Y, Z. Заменяете на свои, дал для примера от фонаря. Координаты ЗАКРЫТЫХ ворот
    0, 0, 0 - Положение объекта относительно осей RX, RY, RZ. Проще говоря, выворот объекта. Нули говорят о том, что обьект находится полностью в вертикальном прямом положении. */

Далее создаем команду. 

Команда на стандартном командном движке:
 

if(strcmp("/gates", cmdtext, true, 10) == 0)// собственно создаем команду, пихать в OnPlayerCommandText
{
   if(vorotaopen == 1) // проверяем, открыты ли ворота. 
    { // если открыты
    
        MoveObject(gate,1798.16, 2951.23, 23.5, 3.0); /* ставим сюда координаты из OnGameModeInit, 3.0 - скорость передвижения ворот */
        vorotaopen = 0;
    }
    else
    {
      	MoveObject(gate, x, y, z, 3.0); // берем координаты ОТКРЫТЫХ ворот, 3.0 - скорость передвижения
      	vorotaopen = 1;
    }
    return 1;//Успешно
}

На zcmd / dc_cmd:

CMD:gates(playerid)// собственно создаем команду, пихать в OnPlayerCommandText
{
    if(!vorotaopen) // проверяем, открыты ли ворота. 
    { // если открыты
    
        MoveObject(gate,1798.16, 2951.23, 23.5, 3.0); /* ставим сюда координаты из OnGameModeInit, 3.0 - скорость передвижения ворот */
        vorotaopen = 1;
      	SendClientMessage(playerid, -1, "Ворота закрыты!");
    }
    else
    {
      	MoveObject(gate,x, y, z, 3.0); // берем координаты ОТКРЫТЫХ ворот, 3.0 - скорость передвижения
      	vorotaopen = 0;
      	SendClientMessage(playerid, -1, "Ворота открыты!");
    }
    return 1;//Успешно
}

Автор: @stibs

Share this post


Link to post
Share on other sites
Nekit_Krut18
𝒷𝓇𝒾𝑔𝒶𝒹𝒶 𝑜𝓃𝑒 𝓁𝑜𝓋𝑒

Спасибо Тебе Огромное Братан!!!

Share this post


Link to post
Share on other sites
Skiffi
Активный

@stibs, Прости конечно, но писать на таком примитивном уровне в 2k17? Серьезно?

Edited by Skiffi

Share this post


Link to post
Share on other sites
Skiffi
Активный

Это в неком роде заставляет задуматься о уровне самого форума.
Ведь администрация форума - его лицо.

Edited by Skiffi

Share this post


Link to post
Share on other sites
DEST
Maintainer

@Skiffi может быть уровень и примитивный, но зато все понятно, как мне кажется. Да и усложнять здесь ничего и не нужно. Простая функция - простая реализация. Это все-таки раздел уроков. 

Share this post


Link to post
Share on other sites
Skiffi
Активный
vorotaopen == 1

Специально для таких применений существует тип переменной bool


Могу написать решение, в более удобной реализации

Share this post


Link to post
Share on other sites
DEST
Maintainer

@HAPKOMAH 

if(переменная_фракции_игрока != ИД_ФРАКЦИИ) return SendClientMessage(playerid, -1, "Вы не состоите в фракции \"НАЗВАНИЕ ФРАКЦИИ\"");

 

Share this post


Link to post
Share on other sites
Человек-редиска
[YT] HOFFMAN

@Skiffi Не,нравиться что-то,так не пишите,а оставьте своё мнение при себе,а то такое ощущение,что вы всё,это пишите для набива сообщений.

Заметка от DEST , создано

Оффтоп устное предупреждение

Share this post


Link to post
Share on other sites
SCRIPTMAN
Великий Гуру

@stibs нормально все, не обращай внимание на того "крутого" набивщика сообщений, но дам совет, советую использовать переменную типа "bool", почему? Потому что в данном случае у тебя знание будет только false или true, поэтому лучше сделать так:

new gate, bool: vorotaopen;

а команды:

if(strcmp("/gates", cmdtext, true, 10) == 0)// собственно создаем команду, пихать в OnPlayerCommandText
{
   if(vorotaopen == true) // проверяем, открыты ли ворота. 
    { // если открыты
    
        MoveObject(gate,1798.16, 2951.23, 23.5, 3.0); /* ставим сюда координаты из OnGameModeInit, 3.0 - скорость передвижения ворот */
        vorotaopen = false;
    }
    else
    {
      	MoveObject(gate, x, y, z, 3.0); // берем координаты ОТКРЫТЫХ ворот, 3.0 - скорость передвижения
      	vorotaopen = true;
    }
    return 1;//Успешно
}
CMD:gates(playerid)// собственно создаем команду, НЕ ПИХАТЬ в OnPlayerCommandText, в конец мода или туда, где у вас кмд
{
    if(vorotaopen == true) // проверяем, открыты ли ворота. 
    { // если открыты
    
        MoveObject(gate,1798.16, 2951.23, 23.5, 3.0); /* ставим сюда координаты из OnGameModeInit, 3.0 - скорость передвижения ворот */
        vorotaopen = false;
      	SendClientMessage(playerid, -1, "Ворота закрыты!");
    }
    else
    {
      	MoveObject(gate,x, y, z, 3.0); // берем координаты ОТКРЫТЫХ ворот, 3.0 - скорость передвижения
      	vorotaopen = true;
      	SendClientMessage(playerid, -1, "Ворота открыты!");
    }
    return 1;//Успешно
}

У тебя тут еще ошибка, если ворота открыты, то они закрываются, но переменная будет, что они открыты, поэтому они не будут открываться, исправил это.

Согласись, так будет лучше :)

Share this post


Link to post
Share on other sites
DEST
Maintainer
36 минут назад, SCRIPTMAN сказал:

У тебя тут еще ошибка, если ворота открыты, то они закрываются, но переменная будет, что они открыты,

Я лично не заметил ошибки у него в первом посте.В первом посте у него точно также как и у тебя, только 0 и 1. Про булеан выше уже писали. 

Share this post


Link to post
Share on other sites
Skiffi
Активный

@Maks_Badanov, для чего существует форум?
- Для обсуждений/помощи
Каждый пользователь форума в праве оставлять свое субъективное мнение.
Если Вы считаете, что так называемый г**но-код - должен присутствовать на форуме, то у меня нет желания вести с Вами дискуссию.

Edited by Skiffi

Заметка от DEST , создано

Оффтоп устное предупреждение

Share this post


Link to post
Share on other sites

Помогите еще сделать, что бы если отойти от ворот на 5-10 метров - то нельзя было бы открывать/закрывать, так-как получается даже на другом конце карты управлять ими

Share this post


Link to post
Share on other sites
В 27.10.2017 в 08:17, DEST сказал:

@HAPKOMAH 


if(переменная_фракции_игрока != ИД_ФРАКЦИИ) return SendClientMessage(playerid, -1, "Вы не состоите в фракции \"НАЗВАНИЕ ФРАКЦИИ\"");

 

Ошибки

new.pwn(3707) : error 017: undefined symbol "ToCheat"
new.pwn(3713) : error 017: undefined symbol "ToCheat"
new.pwn(3718) : error 017: undefined symbol "IsACop"
new.pwn(3727) : error 017: undefined symbol "ToCheat"
new.pwn(3740) : error 017: undefined symbol "OnPlayerGiveWeaponSkill"
new.pwn(3749) : error 017: undefined symbol "ToCheat"
new.pwn(3757) : error 017: undefined symbol "IsACop"
new.pwn(3785) : error 017: undefined symbol "SetHealth"
new.pwn(3815) : error 017: undefined symbol "SKick"
new.pwn(3895) : error 017: undefined symbol "MysqlUpdatePlayerInt"
new.pwn(3910) : error 017: undefined symbol "Converts"
new.pwn(4023) : error 017: undefined symbol "TransferMoney"
new.pwn(4040) : error 017: undefined symbol "ToggleLock"
new.pwn(4065) : error 017: undefined symbol "WHDataUpdate"

А вот проверка (P.S Выделил еще код которых был рядом, что бы было понятно где проверка )

CMD:openarm(playerid)// собственно создаем команду, НЕ ПИХАТЬ в OnPlayerCommandText, в конец мода или туда, где у вас кмд
{
	if(IsACop(playerid) != TEAM_NG) return SendClientMessage(playerid, -1, "Вы не состоите в фракции \"НАЗВАНИЕ ФРАКЦИИ\"");
		{
    if(vopenarm == true) // проверяем, открыты ли ворота.
    { // если открыты

 

Сделал еще шлагбаум, вот код открытых и закрытых.

MoveObject(gated,2579.8274, -2438.6987, 21.4021, 3.0, 0.0000, -90.0000, 270.0000); и MoveObject(gated,2579.8274, -2438.6987, 21.4021, 3.0, 0.0000, -10.0000, 270.0000);

Он открывается резко, а не плавно.

Сначала по схеме сделал армии - открываются плавно.

Решил другой фраке шлагбаум сделать - открывается резко.

Share this post


Link to post
Share on other sites
DEST
Maintainer

@HAPKOMAH скобку после if(IsACop(playerid) != TEAM_NG) ... убери. Если резко, значит смотри как сделаны координаты в армии и как сделал координаты ты. 

Share this post


Link to post
Share on other sites
4 минуты назад, DEST сказал:

@HAPKOMAH скобку после if(IsACop(playerid) != TEAM_NG) ... убери. Если резко, значит смотри как сделаны координаты в армии и как сделал координаты ты. 

Спасибо, помог.

Share this post


Link to post
Share on other sites
В 28.10.2017 в 15:04, DEST сказал:

@HAPKOMAH скобку после if(IsACop(playerid) != TEAM_NG) ... убери. Если резко, значит смотри как сделаны координаты в армии и как сделал координаты ты. 

Помоги еще сделать, что бы если отойти от ворот на 5-10 метров - то нельзя было бы открывать/закрывать, так-как получается даже на другом конце карты управлять ими

Share this post


Link to post
Share on other sites
DEST
Maintainer

@HAPKOMAH 

if(!IsPlayerInRangeOfPoint(playerid, 50.0, X, Y, Z)) return SendClientMessage(playerid, -1, "На таком расстоянии невозможно управлять воротами!");

Добавить в начало команды, соответственно заменив X, Y, Z на координаты ворот

Share this post


Link to post
Share on other sites
2 минуты назад, DEST сказал:

@HAPKOMAH 


if(!IsPlayerInRangeOfPoint(playerid, 50.0, X, Y, Z)) return SendClientMessage(playerid, -1, "На таком расстоянии невозможно управлять воротами!");

Добавить в начало команды, соответственно заменив X, Y, Z на координаты ворот

50.0 - Это 5 или 50 метров?

Share this post


Link to post
Share on other sites
MaJoR
Постоянный
В 27.07.2017 в 21:12, stibs сказал:

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

Думаю, можно начинать. 

Для начала создадим переменную самих ворот, с которыми будем работать. 

Ко всем new:


new gate,
    vorotaopen;

Теперь следуем в паблик OnGameModeInit. Туда вставляем следующее


gate = CreateObject(980, 1798.16, 2951.23, 23.5, 0, 0, 0); 
/* Поясняю: gate = - присваиваем переменно gate ид нашего объекта, который и будем двигать. 
	CreateObject - функция создания объекта.
    980 - ид объекта (ворот), можете заменить на свой
    1798.16, 2951.23, 23.5 - координаты X, Y, Z. Заменяете на свои, дал для примера от фонаря. Координаты ЗАКРЫТЫХ ворот
    0, 0, 0 - Положение объекта относительно осей RX, RY, RZ. Проще говоря, выворот объекта. Нули говорят о том, что обьект находится полностью в вертикальном прямом положении. */

Далее создаем команду. 

Команда на стандартном командном движке:
 


if(strcmp("/gates", cmdtext, true, 10) == 0)// собственно создаем команду, пихать в OnPlayerCommandText
{
   if(vorotaopen == 1) // проверяем, открыты ли ворота. 
    { // если открыты
    
        MoveObject(gate,1798.16, 2951.23, 23.5, 3.0); /* ставим сюда координаты из OnGameModeInit, 3.0 - скорость передвижения ворот */
        vorotaopen = 0;
    }
    else
    {
      	MoveObject(gate, x, y, z, 3.0); // берем координаты ОТКРЫТЫХ ворот, 3.0 - скорость передвижения
      	vorotaopen = 1;
    }
    return 1;//Успешно
}

На zcmd / dc_cmd:


CMD:gates(playerid)// собственно создаем команду, пихать в OnPlayerCommandText
{
    if(!vorotaopen) // проверяем, открыты ли ворота. 
    { // если открыты
    
        MoveObject(gate,1798.16, 2951.23, 23.5, 3.0); /* ставим сюда координаты из OnGameModeInit, 3.0 - скорость передвижения ворот */
        vorotaopen = 1;
      	SendClientMessage(playerid, -1, "Ворота закрыты!");
    }
    else
    {
      	MoveObject(gate,x, y, z, 3.0); // берем координаты ОТКРЫТЫХ ворот, 3.0 - скорость передвижения
      	vorotaopen = 0;
      	SendClientMessage(playerid, -1, "Ворота открыты!");
    }
    return 1;//Успешно
}

Автор: @stibs

А как сделать чтобы они сами закрывались через несколько секунд

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.