Гость stibs

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

В теме 31 сообщение

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Отредактировано пользователем Skiffi

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Отредактировано пользователем Skiffi

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
vorotaopen == 1

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


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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@HAPKOMAH 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
36 минут назад, SCRIPTMAN сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Отредактировано пользователем Skiffi

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 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);

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
4 минуты назад, DEST сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 28.10.2017 в 15:04, DEST сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@HAPKOMAH 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 минуты назад, DEST сказал:

@HAPKOMAH 


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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!


Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.


Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу