Вис691 Автор темы 663 Опубликовано 16 июля, 2018 Ох, что же так сложно-то. Нет там скрипта. Никакого. Вообще. Не от скрипта появляется стелс-поле. И даже стелс-бои не от скриптов работают. StealthBoyStopCombatScript просто выводит игрока из боя при активации стелс-поля. Поделиться сообщением Ссылка на сообщение
Nik Wesker 75 Опубликовано 16 июля, 2018 Пойду искать дальше Поделиться сообщением Ссылка на сообщение
Вис691 Автор темы 663 Опубликовано 22 сентября, 2018 Возвращаясь к самому первому посту в этой теме, наткнулся на интересную фразу: Short (или Int) - целочисленные переменные. Диапазон значений от -32768 до 32767Long - тоже самое, только с другим диапазоном: от -2147483648 до 2147483647. Нигде не видел, чтобы их кто-то использовал Конкретно, конечно, имею в виду пометку про переменные типа Long. По интересному стечению обстоятельств я таки столкнулся с этим типом. Самое забавное, что пришлось им пользоваться самому. Если вкратце, то нужен был код, позволяющий одну из восемнадцати переменных увеличивать до одного, а остальные семнадцать уменьшать до нуля. Если говорить совсем по-простому, представьте что перед вами 18 лампочек. В любой момент времени гореть может только одна. Пускай горит лампа номер 5. Если вы зажигаете, скажем, лампу номер 12, то 5ая обязана потухнуть. Как это сделать? Ну, из логичных вариантов на ум приходит запоминать, какая лампа горит в данный момент и при зажигании другой тушить её и запоминать новую. К сожалению, переводя это всё в код скрипта, необходимо будет писать 18 проверок а-ля "Если горела лампа номер 1, то потушить её. Иначе если горела лампа номер 2, то потушить её ..." И так далее. Решение рабочее, но учитывая ограничения на количество строк в скрипте, не самое элегантное. А есть и более плохой вариант (который и использовался изначально, когда переменных-"лампочек" было около пяти): не запоминаем вообще ничего, а просто постоянно выключаем все лампы, кроме нужной. Даже если лампа и не горела в данный момент. "Если зажгли лампу номер 1, то потушить лампу номер 2 потушить лампу номер 3 ... иначе если зажгли лампу номер 2, то потушить лампу номер 1 потушить лампу номер 3 ..." Думаю, смысл ясен. Очевидно, что этот вариант совершенно неприемлемый. Однако он имеет место быть, если была бы возможность/необходимость зажигать сразу несколько ламп. Тогда бы прошлый, более компактный вариант, не совсем бы подходил и раздувался бы по количеству строк. "Что же делать?" - подумал я. Хотелось бы иметь всего одну кнопку, по нажатию которой сразу бы выставлялись все 18 состояний ламп. И тут я придумал следующее: в качестве кнопки будем передавать обычное число, скажем, 4. Вы наверное спросите, а как число 4 может изменить состояние всех 18ти лампочек? Всё очень просто - переведите число в двоичную систему, тогда оно будет состоять только из нулей и единиц. Даже если вы про такую только слышали или вообще слышите впервые, то ничего не составит труда разобраться. Это абсолютно такие же числа, которыми мы пользуемся. Как работает наша система? У нас есть 10 цифр 0-9, и, когда мы доходим до следующего после 9ки числа, мы просто добавляем новый разряд и получаем 10. Также и там, только цифр всего 2. Но это всё теория, которую даже знать не надо - есть куча конвертеров в Интернете, где за 5 секунд вы сможете перевести любое число в любую систему. Вернёмся к нашим баранам. Что я там выбрал, 4ку? В двоичной системе это число записывается как 100. "И что же тебе это даёт?" - спросите вы. А всё очень просто, пускай 0 - это лампа выключается, а 1 - включается. Добавлю для наглядности нулей перед нашим числом, чтобы выровнять по по количеству лампочек: 000000000000000100. Соответственно, каждый разряд соответствует своей лампочке. Имея функцию, которая просто приравнивает лампочки к разрядам а-ля "Лампа 1 = 0 (т.е. тушим её) Лампа 2 = 0 ... Лампа 16 = 1 (зажигаем) ..." мы с лёгкостью избавили себя от 18ти проверок (или 18*18 изменений состояний по второму методу) и сократили код до 18 строк. Ну, конечно, их по факту чуть больше, но не в этом смысл. При этом мы можем "зажечь" абсолютно любую комбинацию из этих ламп (хоть мне и нужно было только по одной). Допустим, хочу зажечь 2ую, 7ую и 15ую лампы. Всё, что мне нужно - это записать последовательность 010000100000001000 и перевести это число в привычную нам десятичную систему. Вручную или через конвертер получаем 67592. Передаём это число в функцию ("нажимаем кнопку") и радуемся жизни. Горят ровно те лампы, которые были нужны. А главное - совершенно не надо думать, чтобы "запрограммировать" какую-либо комбинацию. Выписал в строку 18 цифр и перевёл из двоичной систему в десятичную. Удобно, красиво, лаконично на мой взгляд. Проблема лишь в том, что с увеличением количества лампочек, увеличивается и количество комбинаций. 67592 явно больше, чем 32767 (см. цитату - это граница integer'a). Отсюда и применение переменной типа Long. Но он тоже не вечен - максимум в теории мы можем завести 31 лампочку (2147483647 = 1111111111111111111111111111111 (31 символ)). А если работаем конкретно с ГЕККом, то у функции, работающей с разрядами, к сожалению, есть ограничение на примерно 20 разрядов-"лампочек". Собственно, пожалуй, это всё, что я хотел сегодня рассказать. Хотелось бы почитать ваше мнение - достаточно ли понятно я всё рассказал, может вопросы какие остались? Придумали/знаете другой способ для зажигания конкретно одной лампочки? Поделитесь им, не стесняйтесь. Да и насколько интересно это было читать? А то, может, я время от времени буду подобными интересными моментами делиться. Или наоборот не буду, если вам не понравилось. 2 Поделиться сообщением Ссылка на сообщение
MagnuMspec 7 446 Опубликовано 22 сентября, 2018 Хмм, битовые маски, как замена многоступенчатым конструкциям if-elseif? Интересно!)) Поделиться сообщением Ссылка на сообщение
Вис691 Автор темы 663 Опубликовано 22 сентября, 2018 Хмм, битовые маски, как замена многоступенчатым конструкциям if-elseif? Интересно!)) Скорее как компактный вариант управления огромным числом состояний. Правда, конкретно мне нужны были лишь 18. Но да, от ненужных if-elseif мы избавились) 1 Поделиться сообщением Ссылка на сообщение
Вис691 Автор темы 663 Опубликовано 4 ноября, 2018 Наткнулся тут на очень интересную страничку https://geckwiki.com/index.php/Script_Compiler_Override Надо будет поэкспериментировать. Поделиться сообщением Ссылка на сообщение
Infest 1 339 Опубликовано 4 ноября, 2018 Наткнулся тут на очень интересную страничку https://geckwiki.com/index.php/Script_Compiler_Override Надо будет поэкспериментировать. Не совсем разбираюсь в моддинге. Можно немного поподробней, что это, с чем едят и для чего служит? Поделиться сообщением Ссылка на сообщение
Вис691 Автор темы 663 Опубликовано 4 ноября, 2018 Не совсем разбираюсь в моддинге. Можно немного поподробней, что это, с чем едят и для чего служит? Ну если совсем кратко, то это просто другой компилятор для скриптов. Позволяет использовать некоторые конструкции, которые нельзя использовать со стандартным. Там очень неплохо на примерах показано различие, поэтому если есть хоть малейшее понимание программирования, то должно быть понятно, что и как. Если же понимания нет, то предлагаю следующий абстрактный пример. Представим, что у нас есть контейнер с ящиками. В них может лежать всё, что угодно - числа, строки, даже другие контейнеры с ящиками. Мы знаем, что в каждом ящике лежит именно какое-то число. А компилятор ГЕККа этого не знает. Поэтому когда мы ему скармливаем содержимое ящика, он ругается: "Я не знаю, что там такое! Я жду на вход число, а вдруг ты мне подкинул строку? Не буду компилироваться!" А этот NVSE'овский компилятор говорит: "Хм, ну раз он мне даёт содержимое ящика, то он уверен, что это число. Скомпилируюсь без проблем. Любые ошибки будут на его совести." Как-то так. 1 Поделиться сообщением Ссылка на сообщение
Вис691 Автор темы 663 Опубликовано 4 ноября, 2018 Ну и до кучи реальный пример из ГК. В моей азартной игре всё зависит от чисел, выпавших на двух кубиках. Проблема в том, что кубики иногда на ребре останавливаются, и нужно их перекидывать. Решил подобные моменты разбавить сообщениями в углу. А-ля советы, анекдоты и прочее (их содержание ещё не придумал). В общем насоздавал сообщений, закинул их в форм лист. По логике, всё, что мне нужно, - при каждом броске брать и выводить следующее сообщение из листа. Как это выглядело бы с компилятором из ГЕККа (опущу объяснение математики и некоторых переменных): let iSize := ListGetCount BHCDCrapsMsgsList ; узнал размер листа, т.е. точное количество сообщений в нём let iNth := iCounter % iSize ; выбрал нужный номер из него let rMsg := ListGetNthForm BHCDCrapsMsgsList, iNth ; наконец вытащил сообщение с номером iNth showMessage rMsg ; показал его С компилятором NVSE это всё можно записать так: let rMsg := ListGetNthForm BHCDCrapsMsgsList, (iCounter % (ListGetCount BHCDCrapsMsgsList)) showMessage rMsg ; вполне вероятно можно и в одну строку всё запихнуть, но у меня не вышло Мало того, что это на пару строк короче, так я ещё и не завожу какие-то второстепенные переменные для хранения промежуточных данных. И всё, что нужно сделать, чтобы этот код скомпилировался - вместо begin GameMode написать begin _GameMode Не знаю, как со стороны обычного юзера, а меня с позиции скриптера это очень впечатлило. 1 Поделиться сообщением Ссылка на сообщение
eyeofgod 0 Опубликовано 14 мая, 2019 Ребят не могу понять, почему скрипт не работает? Поделиться сообщением Ссылка на сообщение
Вис691 Автор темы 663 Опубликовано 14 мая, 2019 Тут только 2 вопроса: 1) На чём висит скрипт? 2) Почему iDoOnce не меняем? Поделиться сообщением Ссылка на сообщение
Паха007 545 Опубликовано 15 мая, 2019 21 час назад, Вис691 сказал: 2) Почему iDoOnce не меняем? Видимо для того, что бы игрок всегда получал сотню крышек при их полном отсутствии, а не однократно. Тогда создается вопрос, а зачем тогда вообще нужна переменная iDoOnce. Поделиться сообщением Ссылка на сообщение
eyeofgod 0 Опубликовано 15 мая, 2019 А на чем должен висеть скрипт? Поделиться сообщением Ссылка на сообщение
MagnuMspec 7 446 Опубликовано 15 мая, 2019 Ну, либо на объекте/неписе, либо на квесте. Здесь наверное нужен квест. iDoOnce здесь бесполезен, т.к. он всегда будет 0. Нужно тогда после добавления крышек делать его 1 (тогда крышки будут добавляться каждый раз, когда ГГ нищий), либо убирать вообще. Поделиться сообщением Ссылка на сообщение
eyeofgod 0 Опубликовано 15 мая, 2019 Нельзя сделать так чтобы на протяжении всей игры работал? Поделиться сообщением Ссылка на сообщение
MagnuMspec 7 446 Опубликовано 15 мая, 2019 40 минут назад, eyeofgod сказал: Нельзя сделать так чтобы на протяжении всей игры работал? Ну, он в текущем виде будет в принципе работать всю игру. Только нужно что-то, что его запускает. Поделиться сообщением Ссылка на сообщение
Вис691 Автор темы 663 Опубликовано 16 мая, 2019 Самый просто вариант - сменить тип скрипта на Quest. Создать какой-нибудь квест, поставить галочку в графе Start Game Enabled. Переменную iDoOnce вообще выкинуть (как и проверку). Тогда всю игру работать будет. Поделиться сообщением Ссылка на сообщение
Old Vault Boy 560 Опубликовано 7 августа, 2019 Добрый день. Есть такой вот скриптец из мода на золотые крышки. scn aaaGoldenBottleCapPressSCRIPT Begin OnActivate If Player.GetItemCount NVDLC01GoldBar >= 1 Player.RemoveItem NVDLC01GoldBar 1 PlaySound WPNThisMachineReloadPt1 Player.AddItem aaaGoldenBottleCapFixedValue 500 else showmessage aaaGoldenBottleCapFailureMessage EndIf End Я хочу сделать патчик для модов Someguy и для модуля RA соответственно. Но поскольку я уже всё по скриптам позабыл, то хотелось бы перестраховаться. Если я дополню код следующими строками он будет работать? scn aaaGoldenBottleCapPressSCRIPT Begin OnActivate If Player.GetItemCount NVDLC01GoldBar >= 1 Player.RemoveItem NVDLC01GoldBar 1 If Player.GetItemCount aaEnclaveGold >= 1 Player.RemoveItem aaEnclaveGold 1 PlaySound WPNThisMachineReloadPt1 Player.AddItem aaaGoldenBottleCapFixedValue 500 else showmessage aaaGoldenBottleCapFailureMessage EndIf EndIf End Или предпочтительна такая структура скрипта. Begin OnActivate If Player.GetItemCount NVDLC01GoldBar >= 1 Player.RemoveItem NVDLC01GoldBar 1 PlaySound WPNThisMachineReloadPt1 Player.AddItem aaaGoldenBottleCapFixedValue 500 else showmessage aaaGoldenBottleCapFailureMessage EndIf If Player.GetItemCount aaEnclaveGold >= 1 Player.RemoveItem aaEnclaveGold 1 PlaySound WPNThisMachineReloadPt1 Player.AddItem aaaGoldenBottleCapFixedValue 500 else showmessage aaaGoldenBottleCapFailureMessage EndIf End Поделиться сообщением Ссылка на сообщение
MagnuMspec 7 446 Опубликовано 7 августа, 2019 Я в скриптах дилетант, но написал бы так: Begin OnActivate If Player.GetItemCount NVDLC01GoldBar >= 1 Player.RemoveItem NVDLC01GoldBar 1 PlaySound WPNThisMachineReloadPt1 Player.AddItem aaaGoldenBottleCapFixedValue 500 elseif Player.GetItemCount aaEnclaveGold >= 1 Player.RemoveItem aaEnclaveGold 1 PlaySound WPNThisMachineReloadPt1 Player.AddItem aaaGoldenBottleCapFixedValue 500 else showmessage aaaGoldenBottleCapFailureMessage EndIf End 1 Поделиться сообщением Ссылка на сообщение
Old Vault Boy 560 Опубликовано 7 августа, 2019 Точно, я про elseif совсем забыл. Спасибо. Поделиться сообщением Ссылка на сообщение
Вис691 Автор темы 663 Опубликовано 13 августа, 2019 Извиняюсь, что так поздно отвечаю. Первый скрипт: scn aaaGoldenBottleCapPressSCRIPT Begin OnActivate If Player.GetItemCount NVDLC01GoldBar >= 1 Player.RemoveItem NVDLC01GoldBar 1 If Player.GetItemCount aaEnclaveGold >= 1 // Сработает ТОЛЬКО, если у игрока есть NVDLC01GoldBar Player.RemoveItem aaEnclaveGold 1 // Сработает ТОЛЬКО, если у игрока есть NVDLC01GoldBar И aaEnclaveGold PlaySound WPNThisMachineReloadPt1 // Аналогично предыдущей строке Player.AddItem aaaGoldenBottleCapFixedValue 500 // Аналогично предыдущей строке else showmessage aaaGoldenBottleCapFailureMessage // Сработает только, если у игрока НЕТ aaEnclaveGold EndIf EndIf End В общем, думаю, нетрудно заметить, что тут всё очень плохо. Работает явно не так, как должно. Второй скрипт: там особых ошибок не вижу, только вот он сработает сразу и для NVDLC01GoldBar, и для aaEnclaveGold одновременно. Вариант от Магнума: этот скрипт тоже сработает, но уже для одного из NVDLC01GoldBar и aaEnclaveGold, что, вероятнее всего, и является тем, чем надо. 2 1 Поделиться сообщением Ссылка на сообщение
Tanatonaft 1 Опубликовано 25 августа, 2019 Приветствую вас. Я не умею писать скрипты, да и мозгов не хватает. Есть ли возможность кому-нибудь помочь мне написать скрипт? Точно не знаю как это работает, но хотелось бы поставить ограничение на ремонт снаряжения в НВ. Допустим чтобы у каждого оружия был лимит на ремонт в 300%, и когда он опустится до 0%, оружие превращается в хлам, и использовать его уже будет нельзя, только заменить на менее поврежденную пушку. Поделиться сообщением Ссылка на сообщение
Вис691 Автор темы 663 Опубликовано 25 августа, 2019 Не очень я понял, что подразумевается под "лимит на ремонт в 300%", также не очень ясно, что подразумевается под заменой, т.е. как этот процесс должен выглядеть. В любом случае, это явно что-то нетривиальное, поэтому надеяться на что-то больше, чем какие-то советы, тут не стоит. Это всё-таки школа, а в ней учителя за учеников работу не делают) Поделиться сообщением Ссылка на сообщение
ХАНТЕР73 102 Опубликовано 25 августа, 2019 27 минут назад, Вис691 сказал: что подразумевается под "лимит на ремонт в 300%" Я так понял, что это типа дополнительный лимит в 300% который исчерпывается от ремонта. Лимит закончился - ремонтировать больше нельзя. 30 минут назад, Вис691 сказал: что подразумевается под заменой Ну замена оружия. Выбросил сломанный, взял новый. 1 Поделиться сообщением Ссылка на сообщение
Торчок из Фрисайда 11 Опубликовано 10 сентября, 2019 Приветствую мастеров скриптового дела. Хотелось бы реализовать скрипт удаления предметов. Например игрок заходит в локацию и весь хлам что там лежит типа бутылок, клея, металлолома, еды, напитков и т.д. - удаляется. Кто может указать направление с которого начинать? Только не всем известное . Поделиться сообщением Ссылка на сообщение