Сложный кодовый замок в CS 1.6 с экраном для ввода и случайным кодом
...извращенцам над энтитями посвящается...(с)
Перед тем как открывать bsp, прочитайте в конце!!!
----------------------------------------------------
Обычные кодовые замки, такие как в предыдущей теме, являются "одноразовыми", т.е. один раз узнал пароль и от него нету пользы. Их можно использовать для всяких модов(как автор и делал), но многим может пригодиться хороший кодовый замок для своей карты. Я предлагаю вам разработанную мной довольно крупную систему для генерирования 3-значного кода для замка и циферблата.
3 знака я взял, так как 2 угадать можно,а 4-слишком много
----------------------------------------------------
Итак начнем.Так как подобную систему мало кто сможет сделать сам(не хватит терпения или времени
), то я объясню принцип ее работы, чтоб вы могли переделать ее под свои идеи.
В карте я объединил группы энтити в визуальные группы, чтоб проще было их искать.
Начинается все с загрузки карты, после чего активируется trigger_auto. Он запускает "вечный двигатель"=2 multi_manager (visgroup "task(0.5sec)"), которые активируют друг друга, а первый активирует 3 счетчика counter1,2,3.Т.е. счетчики активируются каждые 0.5 секунд(время можно увеличить в multi_manager, это нужно чтоб обеспечить случайность кода).
Каждый счетчик имеет разный предел(я взял 2,3,5), чтоб случайность была больше. Каждый из них активирует свою цепочку смены кода(visgroup firstkey random, secondkey random, thirdkey random). Для начала генерирования кода нужно активировать multi_manager "counteron" (visgroup "turn on randomize"), в примере он активируется кнопкой возле респа, на карте надо ставить trigger_multiple, чтоб человек прошел через него, а возле клавиатуры надо поставить триггер, который будет выключать генерацию кода, т.е. активировать counteroff(трудно будет угадать код, который меняется постоянно
).
Теперь о принципе их работы. Расскажу про первую цепочку, остальные аналогично.
Во главе цепочки стоит trigger_breakable m1, который является "указателем" на цифру кода. Можно использовать любой другой энтити, который активирует target после активации(func_door можно брать с флагом toggle). m1 имеет target on break t11, первая пара trigger_changetarget в цепочке. Первый из них(тот, что выше) меняет target у m1 на t12(продвижение по цепочке), а второй меняет target у объекта func_breakable firstkey, который отвечает за первую цифру в коде. После активации указатель двигается вперед, меняя первую цифру в коде(чуть позже будет). Каждая из цепочек имеет свою последовательность цифр, она записана в нижних trigger_changetarget(а именно в поле new target). В примере я для каждой цифры кода использовал разные последовательности.
После остановки генерации( когда игрок подойдет в циферблату) мы имеем 3 func_breakable(firstkey,secondkey,thirdkey, visgroup "random init"), в target которых записана нужная цифра. В той же visgroup мы видим по 10 trigger_changetarget для каждой цифры. С этим пока все.
Теперь о циферблате. Каждая цифра(func_button) активирует func_door с такой же цифрой(у меня в примере кнопки-белые цифры, двери-красные цифры), что будет нашим "экраном", который показывает что мы ввели. Сначала все кнопки имеют в target func_door с именем 1digitN, где N-цифра на кнопке, а "1" обозначает первую цифру, которую мы вводим. Каждая func_door для каждой цифры кода имеет в target некий game_counter(limit=2) resetMd(M=1,2,3). При этом мы заранее установили эти счетчики в позицию 1 через game_counter_set "setcounter", который активируется вместе с первой цифрой кода(когда игрок подошел). Эти game_counter нужны, так как func_door активирует target при открытии и закрытии, а нам нужно только 1 раз, а game_counter_set нужен, потому что если в счетчике взять initial value 1, то он будет сбиваться не к 0, как нам надо, а к этой 1.
После нажатия кнопки активируется один из счетчиков. В случае неверной кнопки счетчик активирует func_breakable "reset", а если правильно, то активируется multi_manager okm1(visgroup normkey), который делает 3 вещи:
1)активирует target1ok - trigger_changetarget, который меняет цель для func_breakable "1wrong?"(visgroup check keys) на 1right. Это необходимо для того, чтоб игрок видел какую цифру он угадал. После ввода 3 цифр будет вызваны 1wrong? 2wrong? 3wrong?, которые активируют зеленую дверь, если их target 1right,2right,3right, и красную, если цель не изменялась. После вызова их target возвращается к начальным(в той же visgroup).
2)активирует счетчик ok, который фиксирует кол-во правильных цифр. Он обнуляется после нажатия 3 кнопок.
3)активирует reset, который мы упоминали.
func_breakable "reset" имеет цепочку, на подобии той, что была в начале(visgroup keycounter(3)). После нажатия клавиш она перемещается вперед, вызывая:
а)multi_manager, который прячет нужное "окошко" циферблата 1blat, 2blat, 3blat(чтоб цифра, которую мы нажали, была видна). Еще он активирует инициализацию второй и третьей цифры в коде secondkey и thirdkey, visgroup "random init"(первую мы инициализировали в начале);
б)10 trigger_changetarget, которые меняют target у кнопок с цифрами на следующую колонку, visgroup "goto second/third key"(1digit1->2digit1,..,1digit9->2digit9,..2digit1->3digit1...).
После 3ей активации reset(3 кнопки нажали) вызывается multi_manager 3keys(visgroup "end of turn"). Он делает много вещей:
1) Отключает клавиатуру, делая target у всех кнопок 111(visgroup turn off keypad), а после 4 секунд включает ее через resetkeypad(visgroup "return to first key")
2) Убирает черную полоску вверху для отображения правильных цифр(выше было упомянуто о 1wrong? и т.д.) и вызывает цветные, после чего обнуляет их значения.
3) Обнуляет счетчик правильно набранных цифр reset_ok(visgroup "norm key counter").
4) Возвращает обратно таблички через 2 сек, которые закрывают набранные цифры, 1blat, 2blat, 3blat.
5) Через 2 сек активирует func_door access, который имеет target "denied"( табличка с надписью "access denied"). Если 3 цифры правильно введены, то target меняется на другую табличку "access accept", и внизу экрана мы видим открыт доступ или нет.
6) Вызывает группу trigger_changetarget resetkeypad. Они возвращают target у кнопок на первую группу func_door(табличек с цифрами) 1digitN(N=0..9).
Если мы ввели 3 цифры правильно, то нам пишут "access accept", дверь открывается и клавиатура блокируется до след активации multi_manager presskey(в начале о нем рассказывал). Он активирует resetkeypad, который опять запускает клавиатуру. Еще он активирует resetdigits(группа trigger_changetarget, visgroup "reset digits"), которые обнуляют предыдущий код(убирает указатели на ok1,ok2,ok3).
-----------------------------------------------------
Надеюсь методы, которые я использовал здесь, помогут кому-то воплотить в жизнь чьи-то идеи, ну или украсят карту небольшим кодовым замком( всего 207 точечных и 63 брашевых этнини).
Если кому что непонятно, пишите, потому что писал я в разное время и ход мыслей мог потерять
. А еще тут все так взаимосвязано, что трудно последовательно изложить принцип его работы.
На счет bsp!!! Когда появляетесь, нажмите на кнопку перед собой( запускает генератор кода), подождите немного. Вы будете видеть как на краю карты бьется стекло. А перед набором кода нажмите кнопку рядом с циферблатом, чтоб остановить генерацию.
Прикрепил исходник с вадом, бсп и скрин с плантациями триггеров в хаммере
p.s. если вы используете это в своей карте и все точечные энтити положите в 1 место, то не думаю что кто-то сможет понять принцип его работы
p.p.s. Саму систему можно еще усовершенствовать и оптимизировать(я, пока писал это сообщение, делал изменения больше 3 раз в уже хорошо рабочем замке).
...извращенцам над энтитями посвящается...(с)
Перед тем как открывать bsp, прочитайте в конце!!!
----------------------------------------------------
Обычные кодовые замки, такие как в предыдущей теме, являются "одноразовыми", т.е. один раз узнал пароль и от него нету пользы. Их можно использовать для всяких модов(как автор и делал), но многим может пригодиться хороший кодовый замок для своей карты. Я предлагаю вам разработанную мной довольно крупную систему для генерирования 3-значного кода для замка и циферблата.
3 знака я взял, так как 2 угадать можно,а 4-слишком много
----------------------------------------------------
Итак начнем.Так как подобную систему мало кто сможет сделать сам(не хватит терпения или времени
В карте я объединил группы энтити в визуальные группы, чтоб проще было их искать.
Начинается все с загрузки карты, после чего активируется trigger_auto. Он запускает "вечный двигатель"=2 multi_manager (visgroup "task(0.5sec)"), которые активируют друг друга, а первый активирует 3 счетчика counter1,2,3.Т.е. счетчики активируются каждые 0.5 секунд(время можно увеличить в multi_manager, это нужно чтоб обеспечить случайность кода).
Каждый счетчик имеет разный предел(я взял 2,3,5), чтоб случайность была больше. Каждый из них активирует свою цепочку смены кода(visgroup firstkey random, secondkey random, thirdkey random). Для начала генерирования кода нужно активировать multi_manager "counteron" (visgroup "turn on randomize"), в примере он активируется кнопкой возле респа, на карте надо ставить trigger_multiple, чтоб человек прошел через него, а возле клавиатуры надо поставить триггер, который будет выключать генерацию кода, т.е. активировать counteroff(трудно будет угадать код, который меняется постоянно
).Теперь о принципе их работы. Расскажу про первую цепочку, остальные аналогично.
Во главе цепочки стоит trigger_breakable m1, который является "указателем" на цифру кода. Можно использовать любой другой энтити, который активирует target после активации(func_door можно брать с флагом toggle). m1 имеет target on break t11, первая пара trigger_changetarget в цепочке. Первый из них(тот, что выше) меняет target у m1 на t12(продвижение по цепочке), а второй меняет target у объекта func_breakable firstkey, который отвечает за первую цифру в коде. После активации указатель двигается вперед, меняя первую цифру в коде(чуть позже будет). Каждая из цепочек имеет свою последовательность цифр, она записана в нижних trigger_changetarget(а именно в поле new target). В примере я для каждой цифры кода использовал разные последовательности.
После остановки генерации( когда игрок подойдет в циферблату) мы имеем 3 func_breakable(firstkey,secondkey,thirdkey, visgroup "random init"), в target которых записана нужная цифра. В той же visgroup мы видим по 10 trigger_changetarget для каждой цифры. С этим пока все.
Теперь о циферблате. Каждая цифра(func_button) активирует func_door с такой же цифрой(у меня в примере кнопки-белые цифры, двери-красные цифры), что будет нашим "экраном", который показывает что мы ввели. Сначала все кнопки имеют в target func_door с именем 1digitN, где N-цифра на кнопке, а "1" обозначает первую цифру, которую мы вводим. Каждая func_door для каждой цифры кода имеет в target некий game_counter(limit=2) resetMd(M=1,2,3). При этом мы заранее установили эти счетчики в позицию 1 через game_counter_set "setcounter", который активируется вместе с первой цифрой кода(когда игрок подошел). Эти game_counter нужны, так как func_door активирует target при открытии и закрытии, а нам нужно только 1 раз, а game_counter_set нужен, потому что если в счетчике взять initial value 1, то он будет сбиваться не к 0, как нам надо, а к этой 1.
После нажатия кнопки активируется один из счетчиков. В случае неверной кнопки счетчик активирует func_breakable "reset", а если правильно, то активируется multi_manager okm1(visgroup normkey), который делает 3 вещи:
1)активирует target1ok - trigger_changetarget, который меняет цель для func_breakable "1wrong?"(visgroup check keys) на 1right. Это необходимо для того, чтоб игрок видел какую цифру он угадал. После ввода 3 цифр будет вызваны 1wrong? 2wrong? 3wrong?, которые активируют зеленую дверь, если их target 1right,2right,3right, и красную, если цель не изменялась. После вызова их target возвращается к начальным(в той же visgroup).
2)активирует счетчик ok, который фиксирует кол-во правильных цифр. Он обнуляется после нажатия 3 кнопок.
3)активирует reset, который мы упоминали.
func_breakable "reset" имеет цепочку, на подобии той, что была в начале(visgroup keycounter(3)). После нажатия клавиш она перемещается вперед, вызывая:
а)multi_manager, который прячет нужное "окошко" циферблата 1blat, 2blat, 3blat(чтоб цифра, которую мы нажали, была видна). Еще он активирует инициализацию второй и третьей цифры в коде secondkey и thirdkey, visgroup "random init"(первую мы инициализировали в начале);
б)10 trigger_changetarget, которые меняют target у кнопок с цифрами на следующую колонку, visgroup "goto second/third key"(1digit1->2digit1,..,1digit9->2digit9,..2digit1->3digit1...).
После 3ей активации reset(3 кнопки нажали) вызывается multi_manager 3keys(visgroup "end of turn"). Он делает много вещей:
1) Отключает клавиатуру, делая target у всех кнопок 111(visgroup turn off keypad), а после 4 секунд включает ее через resetkeypad(visgroup "return to first key")
2) Убирает черную полоску вверху для отображения правильных цифр(выше было упомянуто о 1wrong? и т.д.) и вызывает цветные, после чего обнуляет их значения.
3) Обнуляет счетчик правильно набранных цифр reset_ok(visgroup "norm key counter").
4) Возвращает обратно таблички через 2 сек, которые закрывают набранные цифры, 1blat, 2blat, 3blat.
5) Через 2 сек активирует func_door access, который имеет target "denied"( табличка с надписью "access denied"). Если 3 цифры правильно введены, то target меняется на другую табличку "access accept", и внизу экрана мы видим открыт доступ или нет.
6) Вызывает группу trigger_changetarget resetkeypad. Они возвращают target у кнопок на первую группу func_door(табличек с цифрами) 1digitN(N=0..9).
Если мы ввели 3 цифры правильно, то нам пишут "access accept", дверь открывается и клавиатура блокируется до след активации multi_manager presskey(в начале о нем рассказывал). Он активирует resetkeypad, который опять запускает клавиатуру. Еще он активирует resetdigits(группа trigger_changetarget, visgroup "reset digits"), которые обнуляют предыдущий код(убирает указатели на ok1,ok2,ok3).
-----------------------------------------------------
Надеюсь методы, которые я использовал здесь, помогут кому-то воплотить в жизнь чьи-то идеи, ну или украсят карту небольшим кодовым замком( всего 207 точечных и 63 брашевых этнини).
Если кому что непонятно, пишите, потому что писал я в разное время и ход мыслей мог потерять
На счет bsp!!! Когда появляетесь, нажмите на кнопку перед собой( запускает генератор кода), подождите немного. Вы будете видеть как на краю карты бьется стекло. А перед набором кода нажмите кнопку рядом с циферблатом, чтоб остановить генерацию.Прикрепил исходник с вадом, бсп и скрин с плантациями триггеров в хаммере

p.s. если вы используете это в своей карте и все точечные энтити положите в 1 место, то не думаю что кто-то сможет понять принцип его работы

p.p.s. Саму систему можно еще усовершенствовать и оптимизировать(я, пока писал это сообщение, делал изменения больше 3 раз в уже хорошо рабочем замке).
Вложения
-
134.5 КБ Просмотров: 468
-
37.8 КБ Просмотров: 415
-
151.8 КБ Просмотров: 1 435
Последнее редактирование:

вообще самый быстрый способ-вводить по 3 одинаковые цифры и за 10 вводов уже будешь знать код