Guest stibs

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

31 posts in this topic

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

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

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

Ко всем 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

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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

Edited by Skiffi

0

Share this post


Link to post
Share on other sites

@Daniil Roslyakov , я к тому что Администратор* выкладывает урок с реализацией ~2014 года

0

Share this post


Link to post
Share on other sites

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

Edited by Skiffi

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites
vorotaopen == 1

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


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

Share this post


Link to post
Share on other sites

Нужно сделать тут проверку на фракцию, поможете?)

0

Share this post


Link to post
Share on other sites

@HAPKOMAH 

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

 

0

Share this post


Link to post
Share on other sites

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

0

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

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

Share this post


Link to post
Share on other sites

@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;//Успешно
}

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

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

1

Share this post


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

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

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

0

Share this post


Link to post
Share on other sites

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

Edited by Skiffi

1

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

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

Share this post


Link to post
Share on other sites

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

0

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);

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

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

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

0

Share this post


Link to post
Share on other sites

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

1

Share this post


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

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

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

0

Share this post


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

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

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

0

Share this post


Link to post
Share on other sites

@HAPKOMAH 

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

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

0

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 метров?
0

Share this post


Link to post
Share on other sites

@HAPKOMAH 50.0 это 50 игровых метров

1

Share this post


Link to post
Share on other sites
В 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

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

0

Share this post


Link to post
Share on other sites

@MaJoR Таймером, SetTimer функция Вам в помощь. 

0

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.