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


Фотография
* * * * - 12 Голосов

Вопросы по плагиностроению

как создать торговца oblivion cs торговец cs как создать торговца oblivion моделирование

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

#3281 Ссылка на это сообщение X-command

X-command
  • Следопыт
  • 70 сообщений

Отправлено

Здесь задавать вопросы по плагиностроению для Обливиона.

Тема по Обливиону. Тема по Морровинду тут.


<a href="http://profile.xfire.../xcommand"><img src="http://miniprofile.x...2/xcommand.png" border="0" class="linked-sig-image" /></a>
Сила - способность улыбаться © Белльмере-сан "One Piece"<img src="http://www.kolobok.u...zer/pirate.gif" border="0" class="linked-sig-image" />


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

#3282 Ссылка на это сообщение Takirell

Takirell
  • <~Broken Steel~>
  • 914 сообщений
  •    

Отправлено

Ну что, работает твой вариант.

Хмм... скажи, а какую модель ты используешь в качестве подсвечника? Лучше EDID дай, я у себя тоже сделаю и чуть доработаю твой вариант скрипта.


Ничто не истинно, все потрачено

#3283 Ссылка на это сообщение EdMSL

EdMSL
  • Авантюрист
  • 119 сообщений
  •  

Отправлено

а какую модель ты используешь в качестве подсвечника?

middlecandlestickfloor04fake.nif

Такую же модель, только со светом (не fake) использует CandlestickFloor04Orange512, например.


Сообщение отредактировал Ed101: 17 октября 2021 - 11:02


#3284 Ссылка на это сообщение Takirell

Takirell
  • <~Broken Steel~>
  • 914 сообщений
  •    

Отправлено

Chandelier04Fake.NIF

Благодарочка, ща у себя намучу и скину свой вариант скрипта.


Ничто не истинно, все потрачено

#3285 Ссылка на это сообщение EdMSL

EdMSL
  • Авантюрист
  • 119 сообщений
  •  

Отправлено

Благодарочка, ща у себя намучу и скину свой вариант скрипта.

Перечитай сообщение, я исправил модель. Хотя это не принципиально, какая именно модель, главное чтобы была приписка fake. У них есть огни, но сами по себе они не излучают свет.


Сообщение отредактировал Ed101: 17 октября 2021 - 11:04


#3286 Ссылка на это сообщение Takirell

Takirell
  • <~Broken Steel~>
  • 914 сообщений
  •    

Отправлено

Перечитай сообщение, я исправил модель. Хотя это не принципиально, какая именно модель, главное чтобы была приписка fake. У них есть огни, но сами по себе они не излучают свет.

Да я понял сразу, т.к источники света с моделью, которые сами по себе светятся.


Ничто не истинно, все потрачено

#3287 Ссылка на это сообщение Takirell

Takirell
  • <~Broken Steel~>
  • 914 сообщений
  •    

Отправлено

Ed101, Короче, наколдовал я такое универсальное дрыгало:

scn TestCandleScript

Short sLoad
Float fDefPos
Float fNewPos
Ref rFlame

Begin OnActivate
if (sLoad > 0)
  if (sLoad == 1)
   rFlame.SetPos z fNewPos
   RemoveFlames
   Let sLoad := 2
  Else
   rFlame.SetPos z fDefPos
   AddFlames
   Let sLoad := 1
  Endif
  rFlame.Update3D
Endif
Return
End

Begin GameMode
;Инициализация
if (sLoad == 0)
  if (IsFormValid rFlame == 0)
   Let rFlame := GetNthChildRef 0
   Return
  Else
   Let fDefPos := rFlame.GetStartingPos z
   Let fNewPos := (fDefPos - 30000)
   Let sLoad := 1
   Return
  Endif
Endif

;Авто-фикс позиций и огней
if ((GetGameLoaded || GetGameRestarted) && sLoad > 0)
  if (sLoad == 1)
   rFlame.SetPos z fDefPos
   if (HasFlames == 0)
    AddFlames
   Endif
  Elseif (sLoad == 2)
   rFlame.SetPos z fNewPos
   if (HasFlames > 0)
    RemoveFlames
   Endif
  Endif
  rFlame.Update3D
  Return
Endif
End 

Блок с авто-фиксом огней можно и убрать, в принципе, только вот если без него отключить огни и сразу же загрузится на сейв, где они включены - огней не будет. Приходится вручную перетыкивать) Убрал еще вообще блок OnLoad, т.к он не всегда выполняется корректно и тогда, когда это нужно. Ну и снес Ref-указатель на сам подсвечник, он банально не нужен и может вообще путать игру.


  • EdMSL это нравится
Ничто не истинно, все потрачено

#3288 Ссылка на это сообщение EdMSL

EdMSL
  • Авантюрист
  • 119 сообщений
  •  

Отправлено

Ed101, Короче, наколдовал я такое универсальное дрыгало:

Неплохо он так оброс. Но я, правда, надеялся, что обойдется без onGameMode, чтобы он постоянно не обрабатывался.



#3289 Ссылка на это сообщение Takirell

Takirell
  • <~Broken Steel~>
  • 914 сообщений
  •    

Отправлено

Неплохо он так оброс. Но я, правда, надеялся, что обойдется без onGameMode, чтобы он постоянно не обрабатывался.

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


Ничто не истинно, все потрачено

#3290 Ссылка на это сообщение EdMSL

EdMSL
  • Авантюрист
  • 119 сообщений
  •  

Отправлено

Игра больше будет лагать из-за источников света, чем от скриптов.

Тут да, согласен. Хорошо, теперь надо решить вторую проблему)

В комнате есть общий выключатель. Сейчас в скрипте на каждый светильник и свет отдельная запись. Цель та же)

Полагаю, надо задействовать массивы.


Сообщение отредактировал Ed101: 17 октября 2021 - 12:37


#3291 Ссылка на это сообщение Takirell

Takirell
  • <~Broken Steel~>
  • 914 сообщений
  •    

Отправлено

Полагаю, надо задействовать массивы.

Зачем? Я чуть покумекаю и рожу готовый вариант, есть пара мыслей.


  • EdMSL это нравится
Ничто не истинно, все потрачено

#3292 Ссылка на это сообщение Takirell

Takirell
  • <~Broken Steel~>
  • 914 сообщений
  •    

Отправлено

Итого, что у меня получилося... Основной универсальный скрипт светильников был дополнен и чуть оптимизирован, теперь это чудовище выглядит вот так:

scn TestCandleScript

Short sLoad
Short sValue
Short sSwitch
Float fDefPos
Float fNewPos
Ref rSwitch
Ref rFlame

Begin OnActivate
if (sLoad > 0)
  if (IsActionRef rSwitch == 0)
   if (sLoad == 1)
    Let sLoad := 2
   Else
    Let sLoad := 1
   Endif
   Let sSwitch := 1
  Else
   ;Т.к команда об активации была получена от основного рубильника, нам нужно понять - в каком именно положении он находится. Для этого считываем у него переменную sFlag
   Let sValue := rSwitch.GetVariable "sFlag"
   if (sValue == 0) && (sLoad != 2)
    Let sSwitch := 1
    Let sLoad := 2
   Elseif (sValue == 1) && (sLoad != 1)
    Let sSwitch := 1
    Let sLoad := 1
   Endif
  Endif
Endif
Return
End

Begin GameMode
;Инициализация
if (sLoad == 0)
  if (IsFormValid rFlame == 0)
   Let rFlame := GetNthChildRef 0
   Return
  Else
   Let fDefPos := rFlame.GetStartingPos z
   Let fNewPos := (fDefPos - 30000)
   Let sLoad := 1
   Return
  Endif
Else
  ;Инициализируем выключатель
  if (IsFormValid rSwitch == 0)
   Let rSwitch := GetParentRef
   Return
  Endif
  ;Блок, отвечающий за включение\выключение огня и света (объединенный)
  if (sSwitch > 0)
   if (sLoad == 1)
    rFlame.SetPos z fDefPos
    if (HasFlames == 0)
     AddFlames
    Endif
   Elseif (sLoad == 2)
    rFlame.SetPos z fNewPos
    if (HasFlames > 0)
     RemoveFlames
    Endif
   Endif
   rFlame.Update3D
   Let sSwitch := 0
   Return
  Endif
Endif

;Авто-фикс позиций и огней
if ((GetGameLoaded || GetGameRestarted) && sLoad > 0)
  Let sSwitch := 1
  Return
Endif
End

А вот скрипт на выключателе (я использовал модельку рычага с EDID RFSwitchLever01):

scn TestLightSwitchScript

Short sCount
Short sFlag
Ref rChild
Ref rMe

Begin OnActivate
if (IsAnimPlaying == 0)
  if (sFlag == 0)
   PlayGroup Forward, 1
   Let sFlag := 1
  Else
   PlayGroup Backward, 1
   Let sFlag := 0
  Endif
  ;Находим и активируем все дочерние светильники, привязанные к этому рычагу
  if (IsFormValid rMe == 0)
   Let rMe := GetSelf
  Endif
  Let sCount := GetNumChildRefs
  while (sCount >= 0)
   Let sCount -= 1
   Let rChild := GetNthChildRef sCount
   ;На всякий случай пропускаем "битые" ссылки (если они есть)
   if (IsFormValid rChild == 0) || (IsRefDeleted rChild)
    continue
   Endif
   rChild.Activate rMe, 1
  loop
  Return
Endif
End

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

P.S Есть еще парочка вариантов реализации задумки, но, как мне кажется, что приведенный выше метод - наиболее прост в исполнении. Ну, как по мне :D


Ничто не истинно, все потрачено

#3293 Ссылка на это сообщение EdMSL

EdMSL
  • Авантюрист
  • 119 сообщений
  •  

Отправлено

P.S Есть еще парочка вариантов реализации задумки, но, как мне кажется, что приведенный выше метод - наиболее прост в исполнении. Ну, как по мне :D

Сейчас затестим.



#3294 Ссылка на это сообщение EdMSL

EdMSL
  • Авантюрист
  • 119 сообщений
  •  

Отправлено

P.S Есть еще парочка вариантов реализации задумки, но, как мне кажется, что приведенный выше метод - наиболее прост в исполнении. Ну, как по мне :D

Не совсем идеально, но работает хорошо. Для моих целей более чем достаточно.

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



#3295 Ссылка на это сообщение Takirell

Takirell
  • <~Broken Steel~>
  • 914 сообщений
  •    

Отправлено

Не совсем идеально, но работает хорошо. Для моих целей более чем достаточно.

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

Да, я знаю об этом. Просто нужно переменные авто-обновлять в зависимости от статуса всех светильников. Мб позже я подумаю, как это сделать.


Ничто не истинно, все потрачено

#3296 Ссылка на это сообщение EdMSL

EdMSL
  • Авантюрист
  • 119 сообщений
  •  

Отправлено

Еще немного доработал скрипт. Но это, скорее, для моих нужд.

Begin OnActivate
	if (IsActionRef Player // поставил проверку на запуск от игрока
		if (IsFormValid rMe == 0)
			Let rMe := GetSelf
		Endif
		
		Let sCount := GetNumChildRefs
		
		while (sCount > 0)// было >= 0, поэтому была лишняя проверка с индексом -1. Ошибка ловится, но зачем, когда можно избежать
			Let sCount -= 1
			Let rChild := GetNthChildRef sCount
			
			if (IsFormValid rChild == 0) || (IsRefDeleted rChild)
				continue
			Endif
			
			rChild.Activate rMe, 1
		loop

                ; Перенес в конец, т.к. изначально весь свет включен и рубильник срабатывал со второго раза.
                ; Убрал анимацию, просто не нужна.
		if (sFlag == 0)
			Let sFlag := 1
		Else
			Let sFlag := 0
		Endif

		Return
	Endif
End

Сообщение отредактировал Ed101: 17 октября 2021 - 17:55


#3297 Ссылка на это сообщение StasLeyke

StasLeyke
  • Авантюрист
  • 139 сообщений
  •    

Отправлено

Как удалить ванильные ЛОДЫ? Деревья на территории Хаммерфелла летают и их нельзя удалить 



#3298 Ссылка на это сообщение Pimple03

Pimple03
  • Авантюрист
  • 116 сообщений

Отправлено

Можно ли переориентировать по сторонам света ранее загруженную внутреннюю ячейку? К примеру я могу задать Reference для NorthMarker'а, а затем через скрипт и команду SerAngle Z изменить его положение. Но в результате изменится только отображение ячейки на миникарте, при этом маркеры дверей останутся на прежнем месте, а показания компаса и соответственно положение маркера игрока на карте никак не поменяются. Команда ResetInterior не помогает.



#3299 Ссылка на это сообщение Bianor

Bianor
  • Талант
  • 232 сообщений
  •    

Отправлено

Можно ли переориентировать по сторонам света ранее загруженную внутреннюю ячейку?

Так ведь в каждой ячейке есть компас-маркер.



#3300 Ссылка на это сообщение Pimple03

Pimple03
  • Авантюрист
  • 116 сообщений

Отправлено

Так ведь в каждой ячейке есть компас-маркер.

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



#3301 Ссылка на это сообщение Takirell

Takirell
  • <~Broken Steel~>
  • 914 сообщений
  •    

Отправлено

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

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


Ничто не истинно, все потрачено





Темы с аналогичным тегами как создать торговца, oblivion cs торговец, cs как создать торговца, oblivion, моделирование

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

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