Модератор форума: Kris†a™  
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)

Вопросы по скриптам Papyrus
sansuli  Offline  Сообщение №1 написано: 31 августа 2012, 13:29 | Отредактировано: Multigone - 23 апреля 2020, 14:24


The Red Sun


193
Уроки по скриптованию на языке Papyrus
Прежде чем задать вопрос просмотрите вышеуказанные уроки.
ok


Тема регламентирована.


• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней.
• Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней.
• При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС.
• При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "
+" полезного сообщения.

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

Красное солнце
Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Myprism  Offline  Сообщение №2791 написано: 8 января 2020, 14:54 | Отредактировано: Multigone - 21 апреля 2020, 20:10


Физик


Multigone,
Код
SoulSize = Target.GetLevel()    
SoulSize = (SoulSize*(3.37 + SoulSize*(-0.25 + SoulSize*(0.0086 - 0.000075*SoulSize)))) as Int
По-моему, красивее.

Multigone, кстати, о совместимости. Существует ли способ вызова функции из второго скрипта, не заполняя второй скрипт в свойствах первого? Смысл вот в чём. Мне нужно подменить нативную функцию Bool Caster.TrapSoul(Actor victim) на функцию (аналогичную) из своего скрипта. Ванильная функция стоит в ванильном скрипте, который используется в пяти объектах. Если я поменяю один только скрипт, не добавляя ему внешних переменных, то я оставлю эти 5 объектов девственно чистыми. А если я ещё каким способом подменю эту функцию за пределами скрипта, то и сам скрипт оставлю чистым.

Multigone  Offline  Сообщение №2792 написано: 8 января 2020, 22:28



832
Myprism,
Поменять ванильную функцию TrapSoul можно только в случае, если отредактировать ее в Actor.psc - в общем, лучше искать другие пути.
Смысл оставлять скрипт чистым? Если в целях совместимости, чтобы другой мод мог представить свою версию этого скрипта поверх твоей модно-ванильной функции, то такая система совместно работать явно не будет.
Там в любом случае нужно будет редактировать маг. эффекты, добавляя ключ. слова, меняя условия, флаги и прочее. Исправляя баги (посох Холдира и проч.). Наверное.

Другой скрипт вызвать можно, ничего не указывая в Property:
Код

MyScriptName MyScriptObject = (Game.GetFormFromFile(0x001234, "MyESPModName.esp") AS SomeEditorType) AS MyScriptName
MyScriptObject.DoSomething()
MyScriptObject.MyInt += 1
((Game.GetFormFromFile(0x001234, "MyESPModName.esp") AS SomeEditorType) AS MyScriptName).DoSomething()

; MyScriptName - имя вызываемого скрипта
; MyScriptObject - произвольное имя для этой временной переменной
; 0x001234 - первые 2 цифры всегда 0
; MyESPModName.esp - имя и расширение мода, содержащего форму со скриптом
; SomeEditorType - приведение формы к конкретному типу (Actor, MiscObject и т.д.). Всегда должно совпадать с типом, который расширяет
   данный скрипт. Приведение может происходить в несколько этапов.
; DoSomething() - эта функция содержится в MyScriptName
; MyInt - эта Property-переменная содержится в MyScriptName (но не внутренняя перем.)

(((Game.GetFormFromFile(0x005678, "SoulTrap.esp") AS Quest).GetAlias(0)) AS ReferenceAlias).GetReference() AS Actor) AS _MGTrackSCPTNPCB
; Напр., получаем скрипт на базовом актере, находящемся в алиасе №0 такого-то квеста
; Если алиас не заполнен, или заполнен не актером, или базовый актер не имеет _MGTrackSCPTNPCB, то все выражение == none.

Myprism  Offline  Сообщение №2793 написано: 9 января 2020, 00:55 | Отредактировано: Myprism - 9 января 2020, 02:01


Физик


Multigone, просто это желание ограничить вносимые изменения только крайне необходимыми. В данном случае, всё, что я хочу изменить, это работу функции SoulTrap. Так как она нативная, то изменить её саму я не могу, зато могу постараться перехватить её как можно ближе к ней самой.

Огромное спасибо за код вызова другого скрипта!
Работает! Таким образом, у меня из мода улетели 5 магических эффектов. Мой мод больше не затрагивает магические эффекты совсем, только в их скрипте подменяется всего одна функция.
Ведь так же можно обращаться по ID к другим объектам других модов...

frodo01  Offline  Сообщение №2794 написано: 18 января 2020, 23:30



5
Нужен скрипт для магического эффекта который выдавал жертве Keyword помогите пж dash

nepewka  Offline  Сообщение №2795 написано: 19 января 2020, 03:08



255
Цитата frodo01

Нужен скрипт для магического эффекта который выдавал жертве Keyword помогите пж


зачем тебе скрипт ? Сам магический эффект может вешать конкретный кейворд, который нужен.
если ты в дальнейшем как-то через скрипт хочешь обратиться к объекту с конкретным кейвордом есть условие: HasMagicEffectWithKeyword
сама конкретная команда по добавлению кейворда, если я правильно помню появилась только с 4 фолла.

в скайриме же кейворды вешаются через формы, к которым потом можно обратиться в скрипте через HasKeyword.

/////////////////////////////
To All, подскажите если мне удалось получить референс цели через скрипт активного магического эффекта, могу ли я каким-то образом воспроизвести этот референс в другом скрипте, скажем маркера активатора ?

Dsion  Offline  Сообщение №2796 написано: 19 января 2020, 11:59



nepewka, так просто передать его туда через функцию.


Код
На активаторе скрипт с именем BlaBlaActivatorScript и такой функцией:
Function KillHorribly(Actor target)
EndFunction

А на эффекте такая проперти:
BlaBlaActivatorScript Property ActivatorScript Auto;

И передача референса как-то так:
ActivatorScript.KillHorribly(akTarget as Actor);

nepewka  Offline  Сообщение №2797 написано: 19 января 2020, 13:28 | Отредактировано: Multigone - 21 апреля 2020, 20:08



255
Dsion

MGEF:
Код
Scriptname MGEFscript extends activemagiceffect

a123 Property 123 Auto

Event OnEffectStart(Actor akTarget, Actor akCaster)
   123.SaveRef(akTarget as Actor)
endevent


Активатор:
Код
Scriptname a123 extends objectreference

Spell property Fireball1 auto
objectreference Ref

Function SaveRef(Actor target)
   Ref = target
EndFunction

event onload()
   Fireball1.cast(Ref, none)
endevent


upd: разобрался. только как обычно бывает после советов Dsion приходилось додумывать до конца  :D

создал квест:
Код
Scriptname AAAquest extends Quest

Actor Property MyActor Auto Hidden

Function SetMyActor(Actor nashNPC)
   MyActor = nashNPC
EndFunction

Bool Function IsMyActorValid()
   If MyActor != NONE ;is valid
      Return true
   Else
      Return false
   EndIf
EndFunction


уже из него вешал актёра на функцию в мгеф, а потом использовал в активаторе:
Код
Actor Player
Actor MyNPC

event onload()
   Player = game.getplayer()
   If SQS.IsMyActorValid() == true
      MyNPC = SQS.MyActor
      Debug.trace( "YA ZIV" )
   Else
      Debug.Trace("nety actora")
   EndIf
   Fireball1.cast(MyNPC, Player)
endevent

frodo01  Offline  Сообщение №2798 написано: 26 января 2020, 13:52 | Отредактировано: Multigone - 21 апреля 2020, 20:08



5
объясните что это за код?
Код
VampireAlias.GetActorReference()

Dsion  Offline  Сообщение №2799 написано: 26 января 2020, 14:36



frodo01, так получение конкретного актора, на которого в данный момент ссылается алиас. Если не ясно, разберитесь с алиасами. Они создаются в настройках квеста и являются чем-то типа переменных: могут указывать или не указывать на конкретные объекты. Например, в квесте управления спутником есть алиас, который указывает на вашего текущего спутника. И мы, можем, например, убить его как-то так: FollowerAlias.GetActorReference().Kill().

Lexo  Offline  Сообщение №2800 написано: 28 января 2020, 11:46


Всепознающий мододел


223
Давно я сюда не писал, но у меня внезапно возникла проблема, которую я уже третий день решить не могу.
В общем, то ли я тупой, то ли что, но не подскажите ответ на 2 вопроса:

1) В Conition есть условие проверки кровати? Да, я знаю, что есть условие GetIsObjectType->Furniture, но проблема в том, что стулья, пентаграммы и прочие предметы мебели туда тоже относятся. У кроватей я не обнаружил общего кейворда. Оно есть только у спальных мешков (BedRoll). Есть ли хоть один способ определить, что это именно кровать, причём любая?

2) Есть ли в скриптах (пусть даже SKSE) функция активации сна? Именно, чтобы появилось меню выбора часов сна. Пробовал скриптом сделать Activate() на невидимую кровать, но игрок вместо этого ложится на неё, а сна ни в одном глазу. Или подскажите, как правильно активировать кровати, чтобы не анимация проигрывалась, а именно открывалось меню сна?

Заранее спасибо!

"Всё слишком относительно, что бы утверждать столь однозначно..." ©

Multigone  Offline  Сообщение №2801 написано: 28 января 2020, 13:30



832
Lexo, для игрока я так определял кровати в перке Activate (вкладка Target):

S IsOwner player = 1 &&
S IsFurnitureAnimType Sit = 0 &&
S HasKeyword RaceToScale = 1 &&
S HasKeyword FurnitureSpecial = 0

Myprism  Offline  Сообщение №2802 написано: 28 января 2020, 14:52 | Отредактировано: Myprism - 28 января 2020, 14:54


Физик


В своих модах мне часто приходится модифицировать уровневые списки. В основном, добавляя туда предметы. Но это порождает проблемы совместимости с модами, которые тоже модифицируют эти уровневые списки. Недавно подсмотрел в одном моде изящное решение. Там сделан пустой самозапускающийся квест с алиасом игрока, на котором висит скрипт добавляющий предметы в уровневые списки. Т.е. в самом моде эти списки не трогаются, а модифицируются скриптом в игре. Буквально, вот строка из того скрипта:
Код
LItemJewelryNecklace.AddForm(LItemDovahJewelryNecklaceVar, 1, 1)

Правда, тут есть одна ошибка. На практике к большому числу объектов из ванильного списка добавляется только один предмет из модового. В результате, модовые предметы встречаются в игре крайне редко. Это я исправил, хотя и пришлось использовать SKSE-функции:
Код
Int n =0
   While MyLItemGems.GetNthForm(n)
     LItemGems.AddForm(    MyLItemGems.GetNthForm(n), MyLItemGems.GetNthLevel(n), 1)
     LItemGems10.AddForm(MyLItemGems.GetNthForm(n), MyLItemGems.GetNthLevel(n), 1)
     LItemGems75.AddForm(MyLItemGems.GetNthForm(n), MyLItemGems.GetNthLevel(n), 1)
     n +=1
   EndWhile

Работает отлично, как раз так, как надо. Но вот какие у меня появились сомнения. Действие этого скрипта сохраняется в сейве игрока. Ведь самих изменённых списков в моде нет и они являются результатом действия скрипта. В итоге, сейв может распухнуть в случае, если модифицируется много уровневых списков. Что вы по этому поводу скажете, стоит ли овчинка выделки?

myav  Offline  Сообщение №2803 написано: 30 января 2020, 12:21



30
Кто-то знает как заставить Papyrus распознавать русские имена?

Вот, к примеру:

string CheckName1 = SelfActor.GetDisplayName()
string CheckName2 = SelfActor.GetActorBase.GetName()
if CheckName1 == "Разбойник"  - не работает.
if CheckName2 == "Разбойник" - тоже не работает.

У меня что-то появилось впечатление, что папирус ВООБЩЕ не понимает русского языка, вот потому и не может сравнить string.

Кто-то может подсказать, не нашли ли люди решение этой проблемы, за последних 7 лет?

Мне нужно взять и сравнить именно ИМЯ, а не расу или еще что-то другое.

Myprism  Offline  Сообщение №2804 написано: 30 января 2020, 13:29 | Отредактировано: Multigone - 21 апреля 2020, 20:02


Физик


myav, что-то мне подсказывает, что Скайрим вообще не различает национальных названий. В общем то ванильные файлы совсем не содержат национальных названий. Все национальные названия находятся в отдельной папке Strings. Было бы странно, если бы папирус их оттуда выуживал. Вас ввело в заблуждение то, что отечественные мододелы не выносят названия в отдельные стринговые файлы. Но папирус писался не под них :)

Тут что-то не то с постановкой задачи. Самым правильным было бы делать так, как делают разработчики игры. А они все национальные названия выносят в отдельный файл (точнее 2). Смысл вот в чём: для перевода мода достаточно перевести только стринговый файл и мод оказывается на другом языке. Можно перевести этот файл на 5 языков и автоматически мод станет на пяти языках. Т.е. идеология авторов заключается в том, что у самого мода нет локализации, а локализация вынесена за его пределы. Так сделаны файлы Скайрима. Перенос части локализации в скрипты сделает невозможной стандартную локализацию.
Ну и если точнее, то локализуются ещё отдельно озвучка и некоторые картинки с названиями (последние поставляются вместе со Скайримом даже неупакованными).
Если мод не очень сложный, то я бы его сделал на английском языке и с настоящей локализацией на русском, вынеся локализацию в стринговые файлы. Мод становится мультиязычным и легко переводимым на любой язык. Я так и делал в своих простых модах для Скайрима SE. Увы другие мои моды очень большие и содержат много текстов, так что до них руки ещё не дошли.

Dsion  Offline  Сообщение №2805 написано: 30 января 2020, 23:18 | Отредактировано: Dsion - 30 января 2020, 23:24



Интересно было бы узнать, зачем может понадобиться сравнивать имя НИП с константым значением... Нет, правда...
Есть ведь фракции, кейворды, формлисты на худой конец.
Может, какой-то смысл в этом и есть, но на первый взгляд выглядит так, будто кто-то пытается жестко изнасиловать все принцыпы совместимости... Типа, как если бы три здоровенных орка поймали молодую эльфиечку.

Ну можно попробовать создать еще одного актора, у которого точно будет имя "Разбойник" и сравнивать их GetDisplayName()

myav  Offline  Сообщение №2806 написано: 31 января 2020, 08:55 | Отредактировано: myav - 31 января 2020, 09:08



30
Dsion, я просто делаю огромный боевой мод. Так как разработчики четко сказали, что следующая версия свитков - будет через несколько лет, не раньше. И пока это не случилось, захотелось еще разок оживить скайрим. Так как, wildcat, ultimate, evolved, deadly моды - слишком слабые. Я на гохе подробно их всех разобрал.

И распознавание НПС по имени - критически нужно :), чтоб боевой мод моментально чекал имя, и по результату - делал разные изменения в боевке. А делать изменения в ванильных данных - плохая идея (любой другой мод тоже перепишет ваниль, а потом начнутся конфликты и сбои). Ты предлагаешь фракции, кейворды, но к примеру, фракция бандитов имеет 480 членов :-Р как углубиться? Отличить бандита от разбойника? По статам? нельзя - другие моды меняют статы. По спелам? тоже нельзя - среди 480 членов, по 30-40 имеют одинаковые спелы. А вот чекнуть имя "разбойник", и сразу куча гемороя с идентификацией отпадет.

Мой мод, уже на 95% закончен, я застрял только в 2х местах. На первый мой вопрос про combatstyles, который я кстати тоже тут задал))) никто не ответил :( Но, на нексусе, общими усилиями - таки разобрались, что к чему.

А второй вопрос на нексусе смысла задавать нету, им не интересен русский язык.

Кто-то может помочь с организацией распознавания русских букв? Или хотя бы - подробно объяснить как выносить и заносить в стринг? Я и сам разберусь, но когда с нуля и методом тыка, это - потерянный месяц. А если кто-то УЖЕ знает, то может помочь за час...

Брать другие моды - это не вариант, так как мне нужно всунуть распознавание прямо в скрипт, и начнутся разборки за авторское право, если я всуну другой мод во внутрь себя :-Р.

Myprism  Offline  Сообщение №2807 написано: 31 января 2020, 09:07 | Отредактировано: Multigone - 21 апреля 2020, 20:01


Физик


myav, вынесение стрингов делается с помощью TES5Edit. Меню локализация.
Разработчики ожидают, что персонажей и объекты будут определять не по именам, а по ID. Имя персонажа другие моды легко могут изменить. Собственно говоря, его меняет любой перевод мода и ваш мод автоматически становится несовместим с любой локализацией вашего мода. А вот ID изменить нельзя, так как это приведёт только к созданию нового персонажа с новым ID.

P.S. Цвет волос, причёска и даже пол не являются определяющими признаками эстрадного актёра :)

myav  Offline  Сообщение №2808 написано: 31 января 2020, 09:14 | Отредактировано: Multigone - 21 апреля 2020, 20:00



30
Myprism, тогда банальный вопрос - как узнать ид разбойника? и отличить его от головореза? Тут подробно расписаны RefId: https://en.uesp.net/wiki/Skyrim:Bandit

я дал ссылку только на разбойников, но там на сайте вообще ВСЕ нпс.

Но, папирус не умеет чекать RefId. Разве что через проверку Cell, но если я буду проверять полное содержимое НПС в Cell каждых 4 секунды, особенно в городах - игра будет фризить. Что очень не хочется... хочется чтобы игра шла даже на древних компах.

всё что мне нужно, это просто идентифицировать. Чтоб скрипт различал босса от рядового.  Это можно сделать или по имени (но проблема с юникодом), или по ид (но как заставить папирус распознавать ref?)

Myprism  Offline  Сообщение №2809 написано: 31 января 2020, 12:38 | Отредактировано: Multigone - 21 апреля 2020, 19:58


Физик


myav, но поймите, вы задаёте такие вопросы, что для ответа на них надо рассказывать вам основы модостроения с самых азов! Во-первых, игра и редактор работают только с ID. Это для удобства программиста в редакторе значатся названия на английском. Если вы попробуете такое название поменять, то игра обязательно спросит, хотите ли вы поменять название или создать новый объект? По очень простой причине: редактор не позволит вам поменять ID ванильного персонажа. Переименовывать можете сколько угодно, это вообще ни на что не влияет, но вот с другим ID может существовать только другой новый персонаж. Т.е. все объекты определяются их главным параметром - ID. Кроме него есть ещё другие свойства, которые различают разных персонажей. Но вот имя - вообще нигде не используется и если вы захотите его поменять, то редактор даже ничего не спросит, так как это ему совсем безразлично.
Теперь о вашей задаче. Уж не знаю, как вы там выделяете персонажей, но если встречается персонаж, то первым делом выясняете скриптом его базового актора. В скриптах это всё названия на английском, но на самом деле, это только ID, которые скрываются за этими названиями для удобства программиста. После того, как определяете базового актора, опрашиваете скриптом его свойства. Их очень много и я не знаю, какие вам важны. По сочетанию этих свойств определяете, что с персонажем делать. Уточняю: в игре есть базовые акторы, например, изгой некоторого уровня, а есть многочисленные экземпляры этого базового актора. У этих экземпляров тоже есть свои свойства и я понятия не имею, какие из них нужны вашему моду. Вообще, для выделения объектов в игре существуют Форм-листы, существуют ключевые слова и т.д.

myav  Offline  Сообщение №2810 написано: 1 февраля 2020, 12:55 | Отредактировано: Multigone - 21 апреля 2020, 19:55



30
Myprism, итак:

На самом деле монстры и нпс не имеют никакого базового ид.
В кодинге скайрима есть только FormID, и RefID.  При чем, RefID базового обьекта вариации на карте является одновременно и BaseID.
Я ничуть не сомневаюсь, что говоря про свой ИД, вы и имели ввиду FormID, только не знали его правильное название. Но, суть не в этом. А суть в том - что по нему НЕЛЬЗЯ сортировать, чтоб запустить другие проверки, и советую больше не предлагать этот метод, другим людям. Я даже распишу, почему.

Что такое FormID ? Когда к игре подключается новый мод, игра по очереди записывает все обьекты (магию, персонажей, магические эффекты, квэсты, книги и т.д.) мода и каждому из них присваивает FormID +1.  Тоесть, на единичку больший. И кроме того, эти форм-ид менять нельзя, но можно удалить.

3 месяца назад, когда я только начинал строить мод, я решил что можно использовать эти FormID для идентификации персонажей. Но потом я увидел как этот FormID взял и поменялся. И мне пришлось поднять этот вопрос на Нексусе, почему формид одного и того же персонажа отличается и можно ли его использовать.

Оказалось, что FormID ванильных персонажей использовать в модах - нельзя. Так как, он может отличаться на разных компьютерах, в зависимости от порядка установки модулей, и от их версий. Всё расписывать тут я не буду, так как их механику мне уже разжевали, и заново философствовать про FormID - нету смысла.

И что у нас остается? А остается только RefID конкретных персонажей и RefID базовых обьектов для этих персонажей... Я и этот вопрос поднял на нексусе, какие есть пути идентификации RefID.  Но к сожалению, ответили что вариантов только 2: либо писать собственный плюгин под skse, либо использовать GetNtfRef, но этот метод даст большие фризы.

И у меня осталось только 2 варианта: либо начать менять ванильные обьекты НПС и писать патчи совместимости под популярные моды, которые их тоже меняют, либо попытаться сделать идентификацию по имени.

Но опять же.. кириллица. Пошел на русский форум, сюда, в надежде что тут адекватные люди и помогут с примерами, как сделать функцию либо плагин чтоб можно было конвертировать имена туда сюда и распозновать по им.

Если практики так и не объявятся, через неделю я закрою этот вопрос и решу проблему методом изменения ванильных нпс + патчи совместимости (как сделали Combat Evolved и Revenge of The Enemies). Но, хотелось бы не трогать ваниль.

Если найдется практик с доброй душой и кучей энтузиазма, и поможет кодом: конвертировать имена с последующей идентификацией по ним, я добавлю его имя (ник) как помощника создания мода + он первым узнает и увидит, что и как мод делает.

Myprism  Offline  Сообщение №2811 написано: 1 февраля 2020, 14:37


Физик


yakor77, замечание о 20/80 работает. Хотя бы потому, что есть левельные списки, которые народ модифицирует охотно, а есть такие, что никому и даром не нужны, так что дифференцированный подход вполне возможен :)

To all, решил экспериментально проверить, как влияет модификация левельных списков на размер сохранения Первые результаты радуют. До установки мода размер сейва 5 555, после установки (примерно 100 объектов добавлены в списки) - 5 550 :) Разумеется, это не мод уменьшил размер сейва. Это только значит, что изменение размера сейва вызванное модом меньше его естественных флуктуаций.

Lexo  Offline  Сообщение №2812 написано: 1 февраля 2020, 14:58 | Отредактировано: Lexo - 1 февраля 2020, 15:02


Всепознающий мододел


223
myav, вы определённо что-то путаете. Myprism не филосовствует, а дело говорит. Учитывая, что вы называете это философией, то вы на самом деле не понимаете, о чём говорите. Есть базовый объект - Бандит. Он написан в СК. Есть его FormID - это цифры и буквы. Есть рефы этого самого бандита - они разбросаны по миру и имеют свой RefID. Вот про базовый объект вам и говорит Myprism. Определяется он просто:

Код
ActorBase property Bandit auto ; проперти базового объекта Бандита
Actor ChuvakRef ; конкретный чувак в мире
ActorBase ChuvakBase = ChuvakRef.GetBaseObject() ; определить базовый объект этого конкретного чувака в мире.

If ChuvakBase == ChuvakBase
debug.Notification("Это бандит")
else
debug.Notification("Это НЕ бандит")
Endif


Так что, прежде чем филосовствовать, сначала поймите основы модов. А ещё лучше, конкретнее описывайте то, что нужно, потому что по вашему сообщению, честно говоря, совершенно не понятно, чего вы хотите и что вам подсказывать. И поверьте, тут нечего и не от кого скрывать. Я на первых порах тоже не очень ясно выражал свои мысли на этом форуме. Когда я понял, что только конкретика поможет найти ответ - тогда мне не только подсказали, что делать, но даже несколько раз написали целые блоки скриптов за меня (за что я до сих пор благодарен). И благодаря этому форуму существует и развивается мой Истинно-фэнтезийный Скайрим.

"Всё слишком относительно, что бы утверждать столь однозначно..." ©

myav  Offline  Сообщение №2813 написано: 1 февраля 2020, 15:00 | Отредактировано: myav - 1 февраля 2020, 15:26



30
yakor77, cloak срабатывает каждых 2 секунды и чекает огромную площадь вокруг игрока: 180 метров.

Если во время этого чека проверять фракцию, класс, все спелы, базовых персонажей и т.д. и это будет проверка только 1 персонажа (и за секунду нужно проверить еще пару десятков персонажей (а в городах - под сотню) а у нас установлено еще 100-150 модов + графические моды - игра зафризит в 80% игроков, кто не имеет топовых компьютеров.

нужна именно КОРОТКАЯ проверка. Просто узнать РЕФ, или просто узнать ИМЯ. реф узнать не получится (не используя cell), этот вопрос уже обсуждали с пол месяца на нексусе, остается только имя. Либо забить на затею и начать менять ваниль. И я уже расписал что базового ИД - не существует.

Но, я всё еще надеюсь, что кто-то поможет по имени.

Lexo, я ничего не путаю.  Я понимаю, что вы пытаетесь выгородить Myprism, после того, что он понаписывал.
Но, проверка ActorBase - засорит кодом по самые уши. Я сначала проверяю, а потом уже пишу и кратко, и философствовать - не мой конек.

Только у одного "бандит" есть около 30и ActorBase:

Бандит с одноручным оружием эльф
Бандит с одноручным оружием бретон
и еще 4 рассы

Бандит с двуручным оружием эльф
и еще 5 рас

Бандит маг
и еще 5 рас

Бандит лучник
и еще 5 рас

Бандит Босс
и т.д.

ВСЕ ОНИ имеют РАЗНУЮ selfactor.GetActorBase и в сумме этих баз - больше тридцати. А персонажей по этой базе - больше пары сотен.
А потом пойдет разбойник, а потом мародер, а потом маг-новичек, маг-адепт, маг-мастер, ледяной маг-новичек и еще сотня имен и по каждой сотне имен: не менее 30и ActorBase.

И если проверить по ActorBase, просто представь, сколько ТЫСЯЧ global variable property придется добавить в скрипт и как он нагрузится.

А если проверять по именни или по ref, нужно "0" global variable, и на каждый случай - всего 1 рядок кода-проверки.

Если кратко:

Какое у тебя имя?
Ты лучник?
Ты маг?
Ты с двуручным оружием?
Ты босс?
Я уже знаю кто ты.

Вот и вся проверка.

А если проверять по ActorBase - тысячи тысяч global variable ActorBase придется добавить в код. Так как, использовать ИД их форм - нельзя. Я уже писал, почему.

Вот почему я и прошу помощь с конвертацией имен, на нексусе ЕСТЬ такие моды, что позволяют распознавать локализованые имена. Но они как плюгины, и я не могу посмотреть их код. Вот потому и нужна помощь, чтобы "повторить" их действие. А не делать тысячи переменных.

myav  Offline  Сообщение №2814 написано: 1 февраля 2020, 15:55 | Отредактировано: Multigone - 21 апреля 2020, 19:51



30
yakor77, и которая зафризит клиент. Я же вам ответил отдельно, по поводу БОЛЬШОЙ проверки каждых 2 секунды. А вы или не прочитали или проигнорировали. По первому вашему сообщению я понял, что предложение было: чекать разные параметры персонажей, а потом результаты конвертировать в цифры. И не менять ваниль.

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

Второй метод работать будет быстро и без фризов, но будет конфликтовать со ВСЕМИ модами, которые тоже трогают ваниль. А таких модов - очень много.

Я про второй метод (что буду править ваниль) тоже написал, но ТОЛЬКО если зайду в полный тупик - не разберусь как проверять по имени. Править ваниль - это плохой метод ((( и годится только как крайняя мера.

Myprism  Offline  Сообщение №2815 написано: 1 февраля 2020, 16:06


Физик


yakor77, в игре есть такая полезная и очень широко используемая штука, как FormList. Это список накиданных туда объектов. Причём, упорядоченный, у каждого объекта есть номер под которым его кинули в этот лист. Игра очень быстро находит объекты в таких листах. Например, берём и создаём список вообще всех персонажей (не обязательно общий, можно отдельно только эльфов или только бандитов). Тогда очень легко определить скриптом, находится ли данный персонаж в этом списке и каков его номер. Для этого совсем не нужно знать его имя :) или даже ID :). Можно сделать сколько угодно тематических списков и проверять в какие из них входит данный персонаж и действовать в зависимости от того, в каких из списков он оказался. Совсем не нужно изобретать велосипед. Всё уже есть.
Есть такое правило: если вы делаете что-то и это получается слишком сложно, то велика вероятность, что вы делаете не то :)

myav  Offline  Сообщение №2816 написано: 1 февраля 2020, 17:40 | Отредактировано: Multigone - 21 апреля 2020, 19:50



30
Myprism, читайте мой ответ для Lexo, там я подробно расписал, насколько грузится скрипт, если всунуть в него 5.000+ переменных ActorBase.

FormList, это тоже самое, так как он копирует формы ActorBase - полностью. Я FormList использую только для мелких поисков, к примеру для CombatStyles, где их всего до 50, что нужны для проверок.
Но создавать массив на 5000-10000 объектов, и куда скопируется ВСЁ (очень много не нужного) - это перебор.

Сказанные на этих 2х страницах варианты - уже проверены месяцы назад, они все не годятся. К сожалению ((
если бы после проверки, оказались годными - я в жизни не поднял бы вопрос тут.

идентифицировать безошибочно, и без нагрузки на фпс, нпс, когда их ДОФИГА похожих - не так уже и легко. Если бы можно было узнать со старта RefID, была бы халява. Но..

Единственное, что я хочу - решить проблемы идентификации. Чтобы мой "cloak" каждых 2 секунды проверял не 5000 переменных (по ActorBase/FormList) и не подвешивал игру, а проверял всего 5 переменных: имя. маг ли. лучник ли. двуручник ли. И всё. Короткая проверка и без нагрузки.

Dsion  Offline  Сообщение №2817 написано: 1 февраля 2020, 18:01 | Отредактировано: Dsion - 1 февраля 2020, 18:12



myav, ты уже попробовал сравнивать имя НИП с именем другого НИП или объекта? Кольца, например.
Даже если ты хочешь именно сравнивать имя, то прописывать это имя в сам скрипт - это точно лажа лажовая нубская. Создай кольцо, пропиши ему имя "Разбойник" и попробуй сравнивать это имя с именем НИП. Интересно, что будет.
Но ты все-равно рехнулся.

myav  Offline  Сообщение №2818 написано: 1 февраля 2020, 18:04 | Отредактировано: myav - 1 февраля 2020, 18:16



30
Dsion, пробовал. Но, papyrus не понимает кириллицы(  Он может сохранить имя, или изменить. И вывести/присвоить назад. Но СРАВНИТЬ русские имена - не может.

Dsion  Offline  Сообщение №2819 написано: 1 февраля 2020, 18:16 | Отредактировано: Dsion - 1 февраля 2020, 18:17



myav, то есть

Берем имя объекта:
String s1 = someForm.GetName();

Берем имя того же объекта в другую переменную:
String s2 = someForm.GetName();

И после этого s1 != s2? Ну ок. Что тогда поделаешь.
Если бы работало, то это бы всё решило.

myav  Offline  Сообщение №2820 написано: 1 февраля 2020, 18:26 | Отредактировано: myav - 1 февраля 2020, 18:30



30
Dsion, я делал проверку так:

в игре добавляю существо через player.placeatme RefID

Например:

player.placeatme 00037bfc  (вызов бандита: имперец, лучник, женского пола)
player.placeatme 00039d3e (вызов разбойника: норд, маг, мужского пола)

а потом простейшая проверка у вызванного нпс:

Код
string TempName=selfactor.GetDisplayName()
debug.notification("имя нпс: " + TempName)
if TempName == "Бандит"
    debug.notification("Проверка что бандит - успешна")
endif


И игра выдает всплывающее сообщение:

имя нпс: бандит

Из чего следует:
1. что мой скрипт запустился вообще, раз что-то написало.
2. что имя взялось (getdisplayname) и вывелось (первая notification)

Но игра НЕ выдает: Проверка что бандит - успешна.

Из чего следует:
1. papyrus не смог сравнить if ("бандит" == "бандит")

тоесть - не понимает кириллицу

тоже самое и по разбойнику и по другим нпс. Я что-только не пробовал.

Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)
Поиск:





Ответ на жалобу смотрите в разделе жалоб