Перейти к содержимому


Фотография

Event`ы

registerforsingleupdate activescript onupdate script

  • Авторизуйтесь для ответа в теме

#1 Ссылка на это сообщение Haxop

Haxop
  • Скиталец
  • 37 сообщений
  •  

Отправлено

Ребят, кто сталкивался с подобной проблемой: создал пару скриптов, которые "раздувают" мое сохранение, вследствие чего это сказывается как на производительности, так и на других скриптах. В скриптах есть Event OnUpdate() и RegisterForSingleUpdate, но как бы грамотно не старался их написать, опираясь на схожие проблемы, всё равно создается очень много ивентов. Вот пример скрипта:

 

Хотел сделать, чтобы НПС-Вервольфам добавлялись левельные повышения здоровья и урона, как и игроку

Event OnEffectStart(Actor akTarget, Actor akCaster)

akTarget.AddSpell(WerewolfImmunity)
RegisterForSingleUpdate(1)
Endevent

 

Event OnUpdate()
RegisterForSingleUpdate(1)
  If GetTargetActor().Getlevel() < 10 && GetTargetActor().HasSpell(AbWerwolf) && !GetTargetActor().HasSpell(WerewolfI)
  GetTargetActor().AddSpell(WerewolfI)
  endif
  If GetTargetActor().Getlevel() >= 10 && GetTargetActor().Getlevel() < 20 && GetTargetActor().HasSpell(AbWerwolf) && !GetTargetActor().HasSpell(WerewolfII)
  GetTargetActor().AddSpell(WerewolfII)
  endif
  If GetTargetActor().Getlevel() >= 20 && GetTargetActor().Getlevel() < 30 && GetTargetActor().HasSpell(AbWerwolf) && !GetTargetActor().HasSpell(WerewolfIII)
  GetTargetActor().AddSpell(WerewolfIII)
  endif
  If GetTargetActor().Getlevel() >= 30 && GetTargetActor().Getlevel() < 40 && GetTargetActor().HasSpell(AbWerwolf) && !GetTargetActor().HasSpell(WerewolfIV)
  GetTargetActor().AddSpell(WerewolfIV)
  endif
  If GetTargetActor().Getlevel() >= 40 && GetTargetActor().HasSpell(AbWerwolf) && !GetTargetActor().HasSpell(WerewolfV)
  GetTargetActor().AddSpell(WerewolfV)
  endif
  if !GetTargetActor().HasSpell(AbWerwolf) && GetTargetActor().HasSpell(WerewolfI) || WerewolfII || WerewolfIII || WerewolfIV || WerewolfV
  GetTargetActor().RemoveSpell(WerewolfI)
  GetTargetActor().RemoveSpell(WerewolfII)
  GetTargetActor().RemoveSpell(WerewolfIII)
  GetTargetActor().RemoveSpell(WerewolfIV)
  GetTargetActor().RemoveSpell(WerewolfV)
  endif
  Endevent




  • Авторизуйтесь для ответа в теме
Сообщений в теме: 7

#2 Ссылка на это сообщение Azazellz

Azazellz
  • Знаменитый оратор
  • 2 055 сообщений
  •    

Отправлено

Ерунду какую-то сделал, как по мне.

Есть же вполне стабильный способ добавлять абилки\скрипты неписям и без этих вот OnUpdate ивентов - через невидимый спелл-плащ. В инструкции, правда, немного лишнего есть, но общий принцип должен быть понятен.

 

Создаешь спелл-плащ на игроке с большим рейнджем, к этому плащу создаешь спелл-эффект.

В спелл-эффекте один единственный скрипт с addspell в нем.

В этот addspell пихаешь свой спелл-абилити с повышением здоровья.

Тонкость - спелл-эффект должен иметь галки на Ignore Resistance и Disallow Absorb\Reflect (иначе будут визуальные баги на некоторых НПС, которым прописано поглощение заклинаний), а эффект этого спелла должен иметь галку No Hit Event и не иметь галки Hostile (иначе НПС во время кулачных драк на тебя нападать станут).

 

Раздается это все через кондишны в СК - в спелл-эффект ставишь проверку на смерть, проверка на расу вервольфа и проверку на то, имеется уже спелл-абилити на этом неписе, или нет.

В спелл-абилити для вервольфов накидываешь все нужные эффекты, разбивая их кондишнами на нужные тебе уровни (типа уровень 0-10 эффект +20 здоровья, уровень 11-20 эффект на +40 здоровья, и т.д.).

 

Итого - один простейший скрипт,который будет завершаться сразу после запуска, и 3 спелла с эффектами (плащ, эффект, статы вервольфов).


Сообщение отредактировал Azazellz: 20 февраля 2019 - 11:30


#3 Ссылка на это сообщение Haxop

Haxop
  • Скиталец
  • 37 сообщений
  •  

Отправлено

Но опять-таки, центром плаща является игрок и пока он не контактирует с нужным неписем, нужного эффекта не произойдет. Уже работал с таким плащом, но там я не ставил чрезмерно большую территорию(в целую локацию). Есть какие-то ещё способы? Через Alias поставить так, чтобы любой перс, с абилкой вервольфа автоматом зачислялся в данную группу?


Вопрос в том, в чем причина "раздувания"? Что я сделал не так, не считая того, что скрипт можно было уменьшить-урезать-написать красивее?



#4 Ссылка на это сообщение Azazellz

Azazellz
  • Знаменитый оратор
  • 2 055 сообщений
  •    

Отправлено

Но опять-таки, центром плаща является игрок и пока он не контактирует с нужным неписем, нужного эффекта не произойдет.

А иначе никак.

Если ты не хочешь править что-то в СК и делать новый мод - это один из немногих доступных вариантов.

И все остальные - тоже через "контакт" с неписями будут работать.

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

 

но там я не ставил чрезмерно большую территорию(в целую локацию)

Ну вот и поставь.

 

Вопрос в том, в чем причина "раздувания"? Что я сделал не так, не считая того, что скрипт можно было уменьшить-урезать-написать красивее?

Вопрос в том, как ты этот скрипт раздаешь. Если плащом и без кондишнов в СК - то у тебя на каждом НПСе будет висеть этот вот скрипт с бесконечным циклом OnUpdate ивентов.

Потому что ты вызываешь апдейт один раз, в начале. И потом цикл продолжается раз за разом, так как ты вызываешь апдейт-ивент еще раз, уже в самом ивенте.

А персонажи, которые имеют "работающие" скрипты, из памяти игры не выгружаются, и продолжают обрабатываться.



#5 Ссылка на это сообщение Haxop

Haxop
  • Скиталец
  • 37 сообщений
  •  

Отправлено

У меня этот скрипт сейчас висит в эффектах в способности "Звериная кровь", там стоит кондишн, на проверку, что цель не игрок, но при этом сейв раздувается только в том случае, если сам игрок вервольф(какой-то парадокс). Просто пытался решить проблему командой Unregisterforupdate, но во-первых: она не помогает, а во-вторых: изюминка скрипта была в том, чтобы с изменением уровня вервольф-нпс становился сильнее, а для этого нужно постоянно мониторить его. А если ставить Alias, то как форсированно добавлять его(непися) в квест и можно ли в нем(квесте) делать какую-то проверку на уровень нпс?



#6 Ссылка на это сообщение Azazellz

Azazellz
  • Знаменитый оратор
  • 2 055 сообщений
  •    

Отправлено

Т.е. ты уже вмешался в способность?

Ну и нафига тогда тебе вообще скрипты? Кодируй всё кондишнами в СК.

 

Если спелл активен, игра где-то раз в секунду перепроверяет кондишны на его эффектах.

Т.е. у тебя есть спелл, в нем список эффектов -

"эффект 1 +20 хп" - в нем кондишн уровня от 10 до 20.

"эффект 2 +40 хп" - в нем кондишн уровня от 21 до 30.

Всё, будет работать автоматически - как только нпс повысит уровень, один эффект отключится, включится другой.



#7 Ссылка на это сообщение Haxop

Haxop
  • Скиталец
  • 37 сообщений
  •  

Отправлено

Фишка в том, что я не использую просто эффект повышения хп, а целый спел из оригинального ская(crWerewolf02, 04), то есть скрипт нужен, чтобы всё это дело вручную не прописывать. К тому же самой "звериной кровью", как не странно персонажи-вервольфы не обладают технически(даже соратники).



#8 Ссылка на это сообщение Azazellz

Azazellz
  • Знаменитый оратор
  • 2 055 сообщений
  •    

Отправлено

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

 

То, что тыделаешь с onUpdate ивентами - это лютая ерунда и вообще не нужно.







Темы с аналогичным тегами registerforsingleupdate, activescript, onupdate, script

Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 скрытых