• Добро пожаловать, Гость. Войдите или зарегистрируйтесь.

Автор Тема: Опыты c OBSE  (Прочитано 764 раз)

Описание: Здесь можно постить идеи и решения, основанные на расширителе скриптового языка.

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн NAVYgator

  • *
  • Сообщений: 1472
  • Репутация: 30.7
  • Пол: Мужской
  • скрипты никому не пишу
    • Просмотр профиля
    • Email
Опыты c OBSE
« : 21 Июнь, 2011, 21:37:23 »
0
Здесь можно выкладывать идеи и решения, основанные на OBSE.

 :PS:
Предложение: если кто-нибудь возьмется писать учебник по OBSE, то я могу поучаствовать. По крайней мере Event Handler Functions уже использую.
« Последнее редактирование: 21 Июнь, 2011, 21:41:54 от NAVYgator »
Награды Всем форумчанам, принимавшим участие в праздновании 10-летия Морровинд За создание новогоднего настроения Всем принявшим участие в 9-летии Тиарума За огромный вклад в развитие Румора

Оффлайн Luna

  • Распорядитель ФА
  • *
  • *
  • Сообщений: 2258
  • Репутация: 71.4
  • Пол: Женский
    • Просмотр профиля
    • Имперский Город
    • Email
Re: OBSE
« Ответ #1 : 29 Июнь, 2012, 16:29:38 »
0
Предложение: если кто-нибудь возьмется писать учебник по OBSE,


До самого учебника, конечно, я не дозрела, но вот функции ввода текста, которые мне приходилось использовать, я переводила, для себя. Возможно, кому-то пригодятся они? Спасибо большое  AleksTirex'у, который проверил и отредактировал этот перевод

PS  Если отписалась не в той теме, то, пожалуйста, перенесите туда, где этот материал окажется на нужном месте))


 Итак..

Функции ввода текста в OBSE


http://cs.elderscrolls.com/constwiki/index.php/Text_Input_With_OBSE
Text Input With OBSE
Этот код будет принимать ввод текста с клавиатуры от игрока, а также отображать текст в MessageBox.
Требование:
Extender Oblivion Script (OBSE) версии 0014 или выше.

Скрипт сохраняет строку в название объекта, для этого Вам необходим сам объект, определенный для этой цели. Этот объект может быть любым, который имеет имя и возможность быть активированным, желательно активатор.
Строка должна иметь начальное значение, которое заканчивается знаком акцента (`). Я использовал " `Ввести название `".
Чтобы использовать любое свое название, скрипт должен быть изменен в пяти местах - и у этих пяти мест это имя должно быть одинаковым. Эти пять мест были отмечены с комментариями "!!! INIT NAME!!! '".
Дополнительно, в двух из этих мест у названия должна быть замыкающая тильда (~).
Эти места были отмечены "w/~", а другие три были отмечены "w/o ~".
Имя не может быть "`~~`", если не изменить места, где эта строка используется в скрипте (в шести местах).
Кроме того, Вам необходим активатор, чтобы прикрепить к нему скрипт. Этот активатор должен быть размещен в мире, чтобы игрок мог активировать его, а так же он может быть активирован другим скриптом через RefID.

Недостатки:
Как говорилось выше, у вводимого имени имеются некоторые специальные правила.
Скрипт поддерживает только латинские буквы, пробелы, тире и апостроф. Поддержка дополнительных символов относительно проста, но имейте в виду, что вам придется делать это самостоятельно, если вы захотите этого.
Кроме того, Caps Lock игнорируется. Учитывая, что он обычно используется для работы, то поддержка Caps Lock может быть добавлена в скрипт с минимальными усилиями.
Наконец, невозможно поддерживать знак акцента (`), тильды (~), точки с запятой (; ) или двойных кавычек (").

Сопутствующие функции.

С этим кодом используются следующие функции:
GameMode
OnActivate
Activate
SetName
ModName
AppendToName
OnKeyDown
IsKeyPressed3
MessageBoxEX
Message
GetButtonPressed

Рекомендуется, чтобы у Вас было некоторое представление о том, что эти функции делают и как они работают.

Использование скрипта.

В текстовом поле будет отображаться запись, когда объект, на котором висит скрипт, будет активирован. Активировать можно как сам объект, так и через другой активатор посредством кода: ActivatorRef.Activate player 1

Заключительные комментарии.

Этот код был тщательно протестирован, и должен работать, если Вы указали String_Var для нужного объекта. Пояснение переводчика: String_Var - переменная строка, в которой будет храниться введенная информация. Для удобства ее добавляют в блок объявленных переменных.

Пример использования функций

scn TextInputBox
; Object script, goes on an Activator

short state
short caps
short button

ref StringVar

short bConsole

Begin GameMode

  if ( state )
    Activate player 1
  endif

End

Begin MenuMode

  if ( state )
    Activate player 1
  endif

End

Begin OnActivate

  if ( state == 0 )
    OnKeyDown 57  ; clears the counter from the initial press when activating the item
    GetButtonPressed  ; clears the counter as well
    if ( StringVar == 0 )
      set StringVar to INSERT_NAME_STORAGE_OBJECT_ID_HERE  ; this is where your string gets stored
    endif
    SetName "`Enter Name`~" StringVar  ; !!!INIT NAME!!! w/ ~
    set state to 1

  elseif ( state == 1 )
    ModName "~|" StringVar
    MessageBoxEx "%n|Done" StringVar  ; the specific text can be changed to meet your needs
    ModName "`Enter Name`|" StringVar  ; !!!INIT NAME!!! w/o ~
    AppendToName "~" StringVar
    set state to 2

  elseif ( state == 2 )
    ; first, standard MessageBox menu stuffs
    set button to GetButtonPressed + 1
    if ( button )  ; pressed Done
      set state to 3
      return
    endif

    ; check for Console
    if ( OnKeyDown 41 )
      set bConsole to bConsole == 0  ; toggle bConsole
    endif

    if ( bConsole )
      return  ; return if in the Console (the rest of the commands break the Console)
    endif

    ; now String-capturing code
    set caps to 0
    if ( IsKeyPressed3 42 ) || ( IsKeyPressed3 54 )  ; either Shift key
      set caps to 1
    endif

    if ( OnKeyDown 16 )
      if ( caps )
        ModName "~|Q~" StringVar
      else
        ModName "~|q~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 17 )
      if ( caps )
        ModName "~|W~" StringVar
      else
        ModName "~|w~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 18 )
      if ( caps )
        ModName "~|E~" StringVar
      else
        ModName "~|e~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 19 )
      if ( caps )
        ModName "~|R~" StringVar
      else
        ModName "~|r~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 20 )
      if ( caps )
        ModName "~|T~" StringVar
      else
        ModName "~|t~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 21 )
      if ( caps )
        ModName "~|Y~" StringVar
      else
        ModName "~|y~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 22 )
      if ( caps )
        ModName "~|U~" StringVar
      else
        ModName "~|u~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 23 )
      if ( caps )
        ModName "~|I~" StringVar
      else
        ModName "~|i~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 24 )
      if ( caps )
        ModName "~|O~" StringVar
      else
        ModName "~|o~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 25 )
      if ( caps )
        ModName "~|P~" StringVar
      else
        ModName "~|p~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 30 )
      if ( caps )
        ModName "~|A~" StringVar
      else
        ModName "~|a~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 31 )
      if ( caps )
        ModName "~|S~" StringVar
      else
        ModName "~|s~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 32 )
      if ( caps )
        ModName "~|D~" StringVar
      else
        ModName "~|d~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 33 )
      if ( caps )
        ModName "~|F~" StringVar
      else
        ModName "~|f~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 34 )
      if ( caps )
        ModName "~|G~" StringVar
      else
        ModName "~|g~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 35 )
      if ( caps )
        ModName "~|H~" StringVar
      else
        ModName "~|h~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 36 )
      if ( caps )
        ModName "~|J~" StringVar
      else
        ModName "~|j~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 37 )
      if ( caps )
        ModName "~|K~" StringVar
      else
        ModName "~|k~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 38 )
      if ( caps )
        ModName "~|L~" StringVar
      else
        ModName "~|l~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 44 )
      if ( caps )
        ModName "~|Z~" StringVar
      else
        ModName "~|z~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 45 )
      if ( caps )
        ModName "~|X~" StringVar
      else
        ModName "~|x~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 46 )
      if ( caps )
        ModName "~|C~" StringVar
      else
        ModName "~|c~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 47 )
      if ( caps )
        ModName "~|V~" StringVar
      else
        ModName "~|v~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 48 )
      if ( caps )
        ModName "~|B~" StringVar
      else
        ModName "~|b~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 49 )
      if ( caps )
        ModName "~|N~" StringVar
      else
        ModName "~|n~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 50 )
      if ( caps )
        ModName "~|M~" StringVar
      else
        ModName "~|m~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 12 )
      if ( caps )
        ModName "~|_~" StringVar
      else
        ModName "~|-~" StringVar
      endif
      set state to 1
    elseif ( OnKeyDown 57 )
      ModName "~| ~" StringVar
      set state to 1
    elseif ( OnKeyDown 40 )  ; CANNOT type double-quote mark
      ModName "~|'~" StringVar
      set state to 1

    elseif ( OnKeyDown 14 ) ; Backspace
      Label 0

      ModName "q~|" StringVar
      ModName "w~|" StringVar
      ModName "e~|" StringVar
      ModName "r~|" StringVar
      ModName "t~|" StringVar
      ModName "y~|" StringVar
      ModName "u~|" StringVar
      ModName "i~|" StringVar
      ModName "o~|" StringVar
      ModName "p~|" StringVar
      ModName "a~|" StringVar
      ModName "s~|" StringVar
      ModName "d~|" StringVar
      ModName "f~|" StringVar
      ModName "g~|" StringVar
      ModName "h~|" StringVar
      ModName "j~|" StringVar
      ModName "k~|" StringVar
      ModName "l~|" StringVar
      ModName "z~|" StringVar
      ModName "x~|" StringVar
      ModName "c~|" StringVar
      ModName "v~|" StringVar
      ModName "b~|" StringVar
      ModName "n~|" StringVar
      ModName "m~|" StringVar
      ModName "-~|" StringVar
      ModName "_~|" StringVar
      ModName " ~|" StringVar
      ModName "'~|" StringVar
      ModName " ~|" StringVar
      AppendToName "~" StringVar
      ModName "~~|~" StringVar

      ModName "|`~~`" StringVar
      ModName "`~~`~|`Enter Name`~" StringVar  ; !!!INIT NAME!!! w/ ~
      ModName "`~~`|" StringVar

      if ( IsKeyPressed3 29 ) || ( IsKeyPressed3 157 ) ; Ctrl+Delete deletes an entire word.
        if ( CompareName " ~" StringVar != 1 )
          if ( CompareName "`Enter Name`" StringVar != 1 )  ; !!!INIT NAME!!! w/o ~
            Goto 0
          endif
        endif
      endif

      set state to 1

    elseif ( OnKeyDown 28 )  ; Enter - ends menu same as Done
      set state to 3

    endif

  elseif ( state == 3 )
    ModName "|`~~`" StringVar
    if ( CompareName "`~~`~" StringVar )
      SetName "`Enter Name`" StringVar  ; !!!INIT NAME!!! w/o ~
      Message "Must enter a new name."
      set state to 1
    else
      ModName "`~~`|" StringVar
      ModName "~|" StringVar
      set state to 0
      set button to 0
      ; include any code to use the string here
      MessageBoxEx "Congratulations, you named it %n" StringVar
    endif
  endif

End


Функции ввода:

http://cs.elderscrolls.com/constwiki/index.php/OpenTextInput
OpenTextInput
Синтаксис:
OpenTextInput "текст1", "текст2",.... "текст20" MenuType maxLength
Открывает меню ввода текста, если он не используется в настоящее время. Значение MenuType равно 0 для MessageBox, 1 для книги, или 2 для прокрутки. Парметр MaxLength определяет максимальное количество символов. Если будет поставлено значение MenuType == 0, то в MessageBox строка ввода будет обозначена курсором. Следующие переменные, введенные после первой, будут обозначены как кнопки (аналогично тому, как это делается для команды GetButtonPressed).

http://cs.elderscrolls.com/constwiki/index.php/UpdateTextInput
UpdateTextInput
Синтаксис:
UpdateTextInput
Выводит меню ввода текста для проверки введенных пользователем данных и обновления отображаемого текста, если это необходимо. Команда должна вызываться в каждом фрейме, в то время как открыто меню ввода, иначе меню просто закроется.

http://cs.elderscrolls.com/constwiki/index.php/InsertInInputText
InsertInInputText
Синтаксис:
InsertInInputText string_var1:varies_var2:varies ... var20: varies
Вставка введенного текста в текущую позицию курсора в меню ввода текста, пока это допускается максимальной длиной строки, определенной varies .

http://cs.elderscrolls.com/constwiki/index.php/GetInputText
GetInputText
Синтаксис:
GetInputText
Возвращает текст, введенный пользователем. Вы можете вызывать эту функцию в любой точке перед вызовом CloseTextInput. Обратите внимание, что возвращаемая строка включает в себя любое HTML форматирование, сделанное пользователем.

http://cs.elderscrolls.com/constwiki/index.php/CloseTextInput
CloseTextInput
Синтаксис:
CloseTextInput
Закрывает меню ввода текста. Она должна ставиться в скрипт после того, как нужная информация уже введена соответствующей командой.

http://cs.elderscrolls.com/constwiki/index.php/IsTextInputInUse
IsTextInputInUse
Синтаксис:
IsTextInputInUse
Возвращает 1, если скрипт в настоящее время использует меню ввода текста, независимо от того, видно оно или нет. Одновременно может работать только одно меню ввода текста.

http://cs.elderscrolls.com/constwiki/index.php/DeleteFromInputText
DeleteFromInputText
Синтаксис:
DeleteFromInputText numToDelete:short bBackwards:bool bDeleteWholeWords:bool
Удаляет количество символов или слов из введенного текста в указанном направлении, начиная с текущей позиции курсора. Обратите внимание, что HTML-теги трактуются и как слово и символ (только эту часть тега удалить не возможно). Оба дополнительных параметра, являются ложными по умолчанию.

http://cs.elderscrolls.com/constwiki/index.php/GetTextInputCursorPos
GetTextInputCursorPos
Синтаксис:
GetTextInputCursorPos
Возвращает текущую позицию курсора как индекс в строке ввода.

http://cs.elderscrolls.com/constwiki/index.php/MoveTextInputCursor
MoveTextInputCursor
Синтаксис:
MoveTextInputCursor numChars:short moveBackwards:bool
Перемещает курсор на указанное количество знаков в указанном направлении от текущей позиции. Обратите внимание, что каждый тег HTML рассматривается как один символ.

http://cs.elderscrolls.com/constwiki/index.php/GetTextInputControlPressed
GetTextInputControlPressed
Синтаксис:
GetTextInputControlPressed
Возвращает скан-код последней нажатой клавиши в сочетании с ключевыми CTRL, за исключением тех ключей, которые зарезервированы для использования в меню ввода текста. Как только код восстановлен, последующий вызов этой команды вернет -1, он также вернет -1, если не была нажата клавиша.

http://cs.elderscrolls.com/constwiki/index.php/MessageBoxEx
MessageBoxEx
Синтаксис:
MessageBoxEX "текст1" var1 var2 ... var20
Отображение отформатированных MessageBox с помощью расширенного спецификатора формата для текстовых сообщений. Спецификаторы формата будут показаны в виде кнопок. Текст кнопок должен быть включен в строку формата, отделенную для каждой кнопки вертикальной чертой |.
Вы можете использовать до 10 кнопок.
Вы можете использовать до 20 переменных.
Примечания:
Для получения информации о том, как создать рабочие меню смотрите описание функции MessageBox.
Отображает максимум 512 символов.
В версии 0014a, количество увеличено 4096 символов.
В версии 0016 с добавлением переменной string_var, этот предел был увеличен до 16 400 символов, хотя однострочный предел еще 512. Использование string_var - очень простой способ обойти однострочный предел..
Применение нескольких MessageBoxes или MessageBoxExes может вызвать возврат GetButtonPressed неверного значения.
« Последнее редактирование: 29 Июнь, 2012, 16:40:55 от Luna »
Награды Участникам бета-тестов TESO За упорство в ожидании окончания 2х-недельной загрузки файлов TESO За создание новогоднего настроения Всем принявшим участие в 9-летии Тиарума

Оффлайн Tiara

  • high-lvl age Tsaesci
  • *
  • Сообщений: 7840
  • Репутация: 92.5
  • Пол: Женский
    • Steam ID - Tiara_Ra
    • Просмотр профиля
Re: OBSE
« Ответ #2 : 29 Июнь, 2012, 19:01:43 »
0
Luna,  это ж супер! Это надо на вики выложить.
We work in the dark - we do what we can - we give what we have. Our doubt is our passion, and our passion is our task. The rest is the madness of art.


GM Tiarum, GM "Pride Inc" (pvp), AD|DC (EU), Trueflame, cp561+
альтмеры, vamp:
Tiara Raise - Mplar, AR 47
Tiara Ra - mDK,AR 31
Tia Ra -  mSorc, AR 7
Tiara Moneta -  mNB, AR 4
Charity Iceborn (DC-side) - Mplar, AR 16
Rayna Sunlight (EP-side) - Mplar, AR 7

Tia-Heal-All - арго, mplar, vamp, AR11
Tia Dra - редгард,  stamDK, ww, AR 5
Tiara Ray - имперец,  BS-tankplar, vamp, AR 6
Ki Tiara - кот, dk-tank, pve slave, ww
Награды Участникам бета-тестов TESO За кропотливую работу на форуме/вики

Оффлайн Luna

  • Распорядитель ФА
  • *
  • *
  • Сообщений: 2258
  • Репутация: 71.4
  • Пол: Женский
    • Просмотр профиля
    • Имперский Город
    • Email
Re: OBSE
« Ответ #3 : 30 Июнь, 2012, 22:28:56 »
0
конкретно - куда?
Награды Участникам бета-тестов TESO За упорство в ожидании окончания 2х-недельной загрузки файлов TESO За создание новогоднего настроения Всем принявшим участие в 9-летии Тиарума

Оффлайн NAVYgator

  • *
  • Сообщений: 1472
  • Репутация: 30.7
  • Пол: Мужской
  • скрипты никому не пишу
    • Просмотр профиля
    • Email
Re: OBSE
« Ответ #4 : 01 Июль, 2012, 10:10:43 »
+1
переменная строка, в которой будет храниться введенная информация.
Какой-то новый термин  ;)
Звучит несколько "не корректно": строка - "ряд знаков, написанных или напечатанных в одну линию."
А "переменная строка" - разное количество знаков, написанных в одну линию? знаки, написанные в одну линию, количество которых может быть разным?

Правильное определение этого: "переменная строкового типа". Для любителей простоты - строковая переменная  :yes:
Т.о., фраза должна быть такой:
строковая переменная, в которой будет хранится введенная текстовая информация
Награды Всем форумчанам, принимавшим участие в праздновании 10-летия Морровинд За создание новогоднего настроения Всем принявшим участие в 9-летии Тиарума За огромный вклад в развитие Румора

Оффлайн AleksTirex

  • *
  • *
  • Сообщений: 529
  • Репутация: 57.3
  • Пол: Мужской
    • Просмотр профиля
    • Email
Re: OBSE
« Ответ #5 : 04 Июль, 2012, 02:23:12 »
0
Какой-то новый термин ...
А "переменная строка" - разное количество знаков, написанных в одну линию? знаки, написанные в одну линию, количество которых может быть разным?Правильное определение этого: "переменная строкового типа". Для любителей простоты - строковая переменная
В данном месте текста - это правильная поправка, :yes: но... "переменная строка" тоже имеет право на существование. Ведь по сути дела новый введённый текс действительно является переменным (его можно менять), а так же он является настоящей строкой (куча символов и т.п.). Отсюда следует, что в данном скрипте действительно существует "переменная строка". ;)
Будьте осторожны в своих желаниях, они могут исполниться!
Награды За огромные знания и желание делиться ими с форумчанами

Оффлайн NAVYgator

  • *
  • Сообщений: 1472
  • Репутация: 30.7
  • Пол: Мужской
  • скрипты никому не пишу
    • Просмотр профиля
    • Email
Re: Опыты c OBSE
« Ответ #6 : 12 Июль, 2012, 08:54:38 »
0
Развивая тему OBSE  ;)

Материал о возможностях OBSE по скриптовому определению удара:

Скрипт, срабатывающий от удара (OBSE)

Теги:
 

Перевод функций OBSE

Автор Dark2Раздел Скриптинг под TES IV

Ответов: 2
Просмотров: 7989
Последний ответ 15 Январь, 2009, 21:03:08
от Dark2

Поиск

 
Top
SimplePortal 2.3.5 © 2008-2012, SimplePortal