Перейти к содержанию

Veloth

Граждане
  • Постов

    46
  • Зарегистрирован

  • Посещение

Весь контент Veloth

  1. OK, Larkin, я спрошу на форуме эксельщиков. Я уже осознал, что это решается именно средствами Экселя. Спасибо за помощь, особенно подсказку про экспорт. Не знал ;)
  2. Может, что не так сделал, но у меня ничего не оказалось в отдельном столбце, ничего не поменялось (см. приложение). Я уж извиняюсь, что так туплю, но в Ыкселе я почти полный нуб.
  3. А можно показать, как будет выглядеть такой блок в Ворде? Не вполне понял про изменяемое число и приписывание табуляции.
  4. Вопрос такой: я пишу длинный скрипт, в котором много раз повторяется один и тот же блок текста; каждый блок отличается только ID объекта, с которым производится операция, например: if ( player->GetItemCount, "ID_1") player->drop, "ID_1" 1 endif if ( player->GetItemCount, "ID_2") player->drop, "ID_2" 1 endif if ( player->GetItemCount, "ID_3") player->drop, "ID_3" 1 endif <...> Как автоматизировать этот процесс? В моем скрипте около 400 разных ID. Может, подскажете макрос для Ворда? P.S. Если еще расскажете, как вытянуть из Object Window все ID в списке, буду вдвойне благодарен!
  5. Larkin, спасибо за подсказку, поправил. А можно ли глобальным переменным присваивать не число, а ItemID?
  6. Так у меня свой скрипт для каждой книги. Названия разные, процедуры в каждом скрипте тоже разные. Только Messagebox одинаковый.
  7. Плагин я делаю для себя; если все получится, с удовольствием выложу. Суть проста: автоматическая библиотека с возможностью читать книги с полок; с собой книги брать нельзя, чтобы у игрока не было возможности уничтожить собранную им же библиотеку. Я люблю собирать книги в игре, но русскоязычных плагинов, помещающих на Вварденфелл библиотеку (без алхимических сортировщиков, пытошных камер и манекенов), я не встречал. О сеттинге и сопутствующих мини-квестах я еще думаю. Кроме того, хочется немного научиться скриптам в CS (это если похожий плагин уже есть, а я не знал). Спасибо большое, постараюсь не мультипостить в будущем. Вы тестили в ванильном CS? И скрипт использовали тот, что я выложил? У меня-то references persist стоит. Да, но вот что-то не складывается с GetAngle. Кстати, пользуясь случаем (и тема, в общем-то, все еще подходит): претворяю в жизнь "топорный" вариант антиугона книг. К каждой книге приаттачен скрипт, по которому при ( onActivate == 1 ) всплывает Messagebox, "беру", "не беру". Если берем, книга на полке Disable, в инвентарь добавляем оригинал (до конца еще не продумал, что дальше, может, глобальную переменную добавлю, может, это будет не оригинал, а копия копии). Так вот, у меня получается, что этот скрипт работает только для одной книги. Допустим, у меня есть книги А, Б и С на полках. При попытке забрать их они активируются, и в инвентарь добавляется А1, Б1, С1. По факту, какую книгу ты бы ни активировал, в инвентарь добавится А1. Вот скрипт: Как я понимаю, все скрипты на книгах проверяют один и тот же MessageBox, и срабатывает первый из них. Не могу сообразить, как изменить скрипт, чтобы он срабатывал только для той книги, которую активируешь.
  8. В том-то и дело, что только по оси Z. Вот что сказано в SFD (стр. 55, выделение мое): Говорят, эта тема осталась и в OpenMW. Короче, просто попробуйте в CS поставить книжку так, как стояла, используя функции GetAngle XYZ и SetAngle XYZ. Не знаю, может, я просто что-то не так делаю, и у вас получится лучше.
  9. Муурн Шепард, поскольку мой опыт работы со скриптами в ванильном CS ограничивается, в основном, этим скриптом, я не могу с уверенностью сказать, что перепробовал уже все, и перепробовал правильно. Но если оставить это за скобками, то да, я и с GetAngle изгалялся, и с глобальными переменными, и с move и, с SetAtStart. И, разумеется, прибавлял и вычитал градусы вручную. Не помогает. Скрипт as is работает, но вот функция SetAngle забагована. Об этом написано и в SFD, и на разных форумах, в основном, забугорных. Чтобы убедиться в этом, достаточно применить save/load, и книги внезапно обретают правильные углы. Проверьте сами, если это вам покажется интересным. В общем, я решил отказаться от этого скрипта. Дело-то не в нем, а в библиотеке. Книга будет выдавать MessageBox (типа "Из читального зала книги выносить запрещено!") с предупреждением при проверке OnActivate. В случае утвердительного ответа в инвентарь добавляется ее копия (копия копии) с приаттаченным спеллом, сама книга на полке деактивируется. Спелл возвращает игрока в ячейку. Или убивает. Единственный способ уйти - сдать книгу библиотекарю. Как-то так...
  10. Второе. На самом деле, решение уже найдено. Вот это работает в ванильном CS (тестим на одной книге, поэтому удаляющий скрипт объединен с определяющим углы и позицию): Begin localScript1 float xPos float yPos float zPos float xAngle float yAngle float zAngle short doOnce short OnPCAdd short OnPCDrop if ( doOnce == 0 ) set xPos to GetStartingPos, X set yPos to GetStartingPos, Y set zPos to GetStartingPos, Z set xAngle to GetStartingAngle, X set yAngle to GetStartingAngle, Y set zAngle to GetStartingAngle, Z set doOnce to 1 endif if ( GetPos X != xPos ) if ( GetPos Y != yPos ) if ( GetPos Z != zPos ) SetPos X xPos SetPos Y yPos SetPos Z zPos endif endif endif if ( GetAngle X != xAngle ) if ( GetAngle Y != yAngle ) if ( GetAngle Z != zAngle ) SetAngle Z zAngle SetAngle Y yAngle SetAngle X xAngle endif endif endif if ( OnPCAdd == 1 ) set OnPCAdd to 0 player->drop "lib_bk_poisonsong1" 1 endif End Теперь проблема в другом: при выставлении книги на полку углы сбиваются. Такое ощущение, что по всем трем осям добавляется по 45 градусов. Как я понял из скриптинга для чайников, это такой баг команды SetAngle. Нельзя, я уже пробовал. SetAtStart, кажется, не работает с объектами. Он для разных кнопок (в Призрачных вратах, например).
  11. Я уже не пользуюсь PlaceItem, у меня последовательность из нескольких скриптов, в которых последовательно player->drop "ItemID" 1, затем setPos по трем осям, и в последнем скрипте этой цепочки setAngle по трем осям. В самом первом скрипте, как и раньше, снимаются getPos и getAngle. В общем, это все одна и та же книга. Для нее тоже требуется знать начальное положение углов. Проблема именно с этим, они считываются (видно при первом входе в ячейку через консоль), но почему-то дальше не могут быть применены.
  12. Решил остановиться на варианте со скриптом, приаттаченным к рандомному объекту в ячейке. Не уверен, что введение дополнительной глобальной переменной и ухищрения с move лаконичнее одного дополнительного скрипта. Стал собирать библиотеку, и при тестировании выяснилось, что при попытке воровства книги, стоявшие вертикально, возвращаются на полку уже в лежачем состоянии (команда типа PlaceItem "lib_bk_Airship_Captains_Journal" xPos yPos zPos angle). Что это и как с этим бороться?.. Очевидно, для точного позиционирования объекта требуются углы по всем трем осям: XYZ. Функция PlaceItem поддерживает только Z. В целом,у меня осталось впечатление (поигрался с позиционированием объекта в CS), что и наследование значения переменных для углов Z типа set ScriptName.variable1 to variable2 тоже не работает. Как все же делается такая штука? Мне казалось, что точное позиционирование объекта в различных модах - задача довольно распространенная и стандартная.
  13. А как вы считаете, хорош ли вариант, при котором книга роняется из ивентаря, а затем move? Вроде бы, нельзя move предметы из инвентаря, поэтому и роняем. Соответственно, книга не дублируется, переменные не обнуляются.
  14. Larkin, на самом деле, я уже решил проблему. По совету Муурн Шепарда сделал глобальную переменную, которая становится == 1, если книгу трогали. (Я сперва по привычке объявил ее в скрипте, поэтому были баги.): if ( doOnce == 0 ) set doOnce to 1 set xPos to ( GetPos X ) set yPos to ( GetPos Y ) set zPos to ( GetPos Z ) set angle to ( GetAngle Z ) Disableendif if ( libcount == 1 ) Enableendif И все заработало. Правда, в библиотеке должно быть очень много книг, и я пока что не понял, как быть. При попытке скоммуниздить книгу она удаляется из инвентаря и возвращается на полку, но при этом все остальные книги в библиотеке тоже становятся Enable :D
  15. Ну, на самом деле мне сказали несколько иначе, и я только теперь понял, о чем речь. disable/enable: if ( player->GetItemCount "bk_QWERTY" ) if ( "copy_bk_QWERTY"->GetDisabled ) "copy_bk_QWERTY"->Enable player->PlaySound "Item Book Down" player->RemoveItem "bk_QWERTY" 1 endif endif StopScript LibraryScript Так работает же. Если ItemID->Disable. В общем, я осознал, что, как сказал Муурн Шепард, PlaceItem создает новую копию с обнуленными переменными, т.е. книга снова станет Disable, а doOnce == 0. Я-то все думал, что это глюк в PlaceItem, а вовсе не в том, что doOnce обнулилась. Наверное, если не выносить doOnce в глобальные переменные, придется делать еще один счетчик для каждой книги. Если ее уже брали в инвентарь, Disable не выполняется. Пока что придумал вот так, но не работает, как нужно: if ( doOnce == 0 ) set doOnce to 1 set xPos to ( GetPos X ) set yPos to ( GetPos Y ) set zPos to ( GetPos Z ) set angle to ( GetAngle Z ) if ( libcount == 0 ) Disable endif endif
  16. Вы уж не обижайтесь, но мне по-прежнему непонятно, в чем ошибка. Вот давайте я напишу, как понимаю скрипт: Итак, при посещении ячейки стартует скрипт на книге (localscript): float xPos float yPos float zPos float angle short OnPCAdd short doOnce Это мы задаем переменные. if ( doOnce == 0 ) set doOnce to 1 Это мы проверяем, в первый ли раз мы в ячейке. if ( doOnce == 0 ) <...> set xPos to ( GetPos X ) set yPos to ( GetPos Y ) set zPos to ( GetPos Z ) set angle to ( GetAngle Z ) Это мы сохраняем в переменных положение книги при первом посещении ячейки. if ( doOnce == 0 ) <...> Disable Это мы деактивируем книгу при первом посещении ячейки. <...> endif if ( OnPCAdd == 1 ) set OnPCAdd to 0 Это книга каждый фрейм проверяет, не взяли ли ее в инвентарь. Если взяли, то set removerScript.xPos to xPos set removerScript.yPos to yPos set removerScript.zPos to zPos set removerScript.angle to angle StartScript removerScript Значения переменных переносятся в removerscript, и запускаем этот скрипт. Вот он, задаем переменные для позиционирования книги: float xPos float yPos float zPos float angle И далее изымаем книгу: if ( player->GetItemCount "copy_bk_QWERTY" ) player->RemoveItem "copy_bk_QWERTY" 1 Ставим на полку, как я понял из вашего объяснения, ее копию с тем же ID: PlaceItem "copy_bk_QWERTY" xPos yPos zPos angle Все. Как мне кажется, return и if... endif можно убрать, если в библиотеке только одна книга (см. первый ответ на мое сообщение). Они нужны, когда книг много, соответственно, изымается из инвентаря только одна из них. Копия на полке должна, как я понимаю, уже активирована (мы не в первый раз в ячейке). По факту, почему-то removerscript ломается, чинится только прописанием ID книги в первом скрипте при команде Disable. Т.е. книга удаляется, но PlaceItem не срабатывает. Так и не понял, почему. У меня такого скрипта нет, все книги размещены в CS, при первом посещении ячейки они деактивируются. Ну, я так и делаю, только не подменяю ее в инвентаре на дефолтную.
  17. Так на стуле уже ничего нет. Со стула скрипт убран, в скрипт на книге прописываем "copy_bk_QWERTY"->disable (вместо просто disable). И внезапно все заработало. Книгу забрать стало невозможно, она удаляется из инвентаря и возникает на положенном ей месте.
  18. Что же поменялось при ItemID->Disable? По идее, скрипт должен так же отрабатывать и деактивировать книгу. Мне бы очень хотелось избавиться от всех ItemID в этом скрипте. Он будет приаттачен к каждой книге, и подставлять ItemID 500 раз мне бы не хотелось. Пусть будет один на всех, и уже из него запускается removerscript со всеми ItemID. Я попробовал не считывать координаты и использовать SetAtStart, но ничего не поменялось. На всякий случай прописывал Enable с тем же результатом (после SetAtStart): if ( OnPCAdd == 1 ) set OnPCAdd to 0 StartScript removerScript SetAtStartendif
  19. Муурн Шепард, я новичок в скриптах CS, поэтому мне не вполне ясно, что это изменит. Штука в том, что все прекрасно работает, так, как я хочу, при деактивации книги отдельным скриптом. Вот он, аттачим его к какому-нибудь стулу: begin libfirst short doOnce if ( doOnce == 0 ) set doOnce to 1 "copy_bk_QWERTY"->Disable endif end Приведенные выше скрипты при этом прекрасно работают (disable убираем из localscript). Как только я пытаюсь убрать скрипт со стула и прописать disable в localscript, что-то ломается. Книга правильно деактивируется при первом посещении ячейки, появляется по скрипту, проверяющему ее наличие в моем инвентаре (стартует из диалога с библиотекарем), но на место уже не возвращается. Почему - не могу понять. Может, в синтаксисе ошибся. Попробовал прописать вместо просто disable вот так: "copy_bk_QWERTY"->Disable и все заработало. Очень странно.
  20. aL, нет, не работает. Книга не помещается обратно на место. Просто исчезает из инвентаря. Работает библиотека в одном случае: если на рандомный объект повесить скрипт, декативирующий все книги при первом посещении ячейки. Тогда команду disable из первого скрипта надо убрать. Но я бы хотел минимизировать количество скриптов и деактивировать книги скриптом, приаттаченном к самой книге (localscript).
  21. Всем привет, помогите разобраться со скриптом, который проверяет у игрока наличие книги в инвентаре, изымает ее и ставит в определенное место. Скрипт планируется использовать в плагине с автоматической библиотекой: игрок может принести книгу (оригинал) в библиотеку (тут все вроде бы работает, спасибо плагину marcmori), но при попытке вынести ее (т.е. копию с полки) срабатывает скрипт, изымающий книгу и ставящий ее на то место, где она была в первый раз активирована, т.е. на полку. В общем, читать книгу можно, в лут кидать нельзя. Итак, с книги считываются координаты (первый скрипт висит на книге): begin localScript float xPosfloat yPosfloat zPosfloat angle short OnPCAddshort doOnce if ( doOnce == 0 ) set doOnce to 1 set xPos to ( GetPos X ) set yPos to ( GetPos Y ) set zPos to ( GetPos Z ) set angle to ( GetAngle Z ) Disableendif if ( OnPCAdd == 1 ) set OnPCAdd to 0 set removerScript.xPos to xPos set removerScript.yPos to yPos set removerScript.zPos to zPos set removerScript.angle to angle StartScript removerScriptendif end Затем она изымается и ставится на место: begin removerScript float xPosfloat yPosfloat zPosfloat angle StopScript removerScript if ( player->GetItemCount "copy_bk_QWERTY" ) player->RemoveItem "copy_bk_QWERTY" 1 PlaceItem "copy_bk_QWERTY" xPos yPos zPos angle returnendif end Почему-то не работает. Книга просто берется в инвентарь, ничего не происходит. При входе в ячейку все время считываются координаты. Подскажите, что не так, пожалуйста.
×
×
  • Создать...