• Страница 1 из 1
  • 1
Модератор форума: Kris†a™  
Форум » TES V: Skyrim » Мастерская » Садовод-любитель (Страничка обсуждения мода)

Садовод-любитель
Stea1ch  Offline  Сообщение №1 написано: 7 мая 2023, 16:15 | Отредактировано: Stea1ch - 8 мая 2023, 00:32



180
Всем ку! Бьюсь уже неделю и не могу вообще ничего понять: полностью копирую нативную систему посадки растений, состаяющую из 2 скриптов, 2 формлистов и НПС (рефы в количестве на каждое посадочное место в каждой из локаций, базовый непись 1). Переделал оба скрипта использованием своих переменных и формлистов, скопировал активатор и назначил ему другой меш, реф и линк на созданного уникального НПС (опять же скопированного с нативного в точности. Привязываю новое посадочное место к маркеру, по образу и подобию с нативными. Назначаю свой скрипт. На непися вешаю второй переделанный скрипт (вот он как раз работает ибо если я положу в инвентарь нужного непися ингредиент из моего формлиста - отрабатывает скрипт и выводится сообщение "растение посажено"). А вот с первым скриптом серьезные проблемы - не отрабатывает ивент "OnActivate" по абсолютно непонятной причине. Более того! Я психанул и повесил на свои объекты родные ванильные скрипты - С ТЕМ ЖЕ РЕЗУЛЬТАТОМ! Вообще не могу понять как оно все там работает! Включил логи и получил выхлоп: [byohplantersoilmossscript < (0C00AA0A)>] OnActivate[05/07/2023 - 06:37:29PM] error: Cannot call Activate() on a None object, aborting function callstack: [ (0C00AA0A)].BYOHPlanterSoilScript.OnActivate() - "BYOHPlanterSoilScript.psc" 

Line 34[05/07/2023 - 06:37:29PM] error: Cannot call Activate() on a None object, aborting function callstack: [ (0C00AA0A)].byohplantersoilmossscript.OnActivate() - "BYOHPlanterSoilMossScript.psc" Line 34[05/07/2023 - 06:37:29PM] warning: Assigning None to a non-object variable named "::temp6"stack: [ (0C00AA0A)].BYOHPlanterSoilScript.OnActivate() - "BYOHPlanterSoilScript.psc" 

Line 34[05/07/2023 - 06:37:29PM] warning: Assigning None to a non-object variable named "::temp9"stack: [ (0C00AA0A)].byohplantersoilmossscript.OnActivate() - "BYOHPlanterSoilMossScript.psc" Line 34[05/07/2023 - 06:37:29PM] error: Object reference has no 3Dstack:


Мои скрипты:

<!--dle_spoiler-->


Мой скрипт на посадочное место (переделанный BYOHPlanterSoilSCRIPT):
Scriptname BYOHPlanterSoilMossScript extends ObjectReference  
import debug
import utility
ObjectReference Property MossContainer auto hidden
ObjectReference property objSelf auto hidden
Bool Property AlreadyLoaded = FALSE Auto Hidden
int property clearPlanterChoice auto hidden
message property planterClearMessage auto
EVENT OnCellAttach()
  debug.trace(self + " OnCellAttach")
 if AlreadyLoaded == FALSE
   debug.trace(self + " OnCellAttach: DO ONCE")
  objSelf = self
  MossContainer = GetLinkedRef()
  (MossContainer as BYOHPlanterMossScript).mySoilRef = objSelf
  AlreadyLoaded = TRUE
 endif
 (MossContainer as BYOHPlanterMossScript).GrowPlantedItem()
endEVENT
auto state empty
 EVENT OnActivate(ObjectReference TriggerRef)
   debug.trace(self + " OnActivate")
  ; temp
  actor containerActor = MossContainer as actor
  if containerActor
   debug.trace(self + " ShowGiftMenu using filter = " + flPlanterPlantableMoss)
   containerActor.ShowGiftMenu(abGivingGift = true, apFilterList = flPlanterPlantableMoss, abShowStolenItems = true, abUseFavorPoints = false)
  else
   MossContainer.Activate(Game.GetPlayer(), FALSE)
  endif
 endEVENT	
endState
state planted
 EVENT OnActivate(ObjectReference TriggerRef)
  IF triggerRef == game.getPlayer()
   clearPlanterChoice = planterClearMessage.show()
   if clearPlanterChoice == 1
    (MossContainer as BYOHPlanterMossScript).plantedFloraRef.delete()
    (MossContainer as BYOHPlanterMossScript).plantedFloraRef = none
    (MossContainer as BYOHPlanterMossScript).plantedFloraBase = none
    ; back to "unplanted" state
;				playAnimation("PlayAnim01")
    self.goToState("empty")
    MossContainer.Activate(Game.GetPlayer(), FALSE)
   endif
  endIf
 endEVENT	
endState
FormList Property flPlanterPlantableMoss auto

Скрипт на неписе (переделанный BYOHPlanterContainerSCRIPT):

Scriptname BYOHPlanterMossScript extends ObjectReference  
formlist property flPlanterPlantableMoss auto	;formlist of plantable moss
formlist property flPlanterPlantedMoss auto	;formlist of planted moss
form property plantedItem auto hidden
form property plantedItemRef auto hidden
form property plantedFloraBase auto hidden
objectReference property plantedFloraRef auto hidden
objectReference property mySoilRef auto hidden
int property plantedItemIndex auto hidden
message property PlanterNotPlantableMESSAGE auto
message property PlanterOnlyOneItemMESSAGE auto
message property PlanterPreviousItemRemovedMESSAGE auto
bool property containerProccessed = false auto hidden
GlobalVariable property GameDaysPassed auto
float plantedTimestamp				; when my item was planted
float resetTimestamp				; last time my planted flora was reset - this is needed because placed objects do not reset with their cell
float property growDays = 1.0 auto
{ number of days it takes to grow after being planted }
float property resetDays = 3.0 auto
{ number of days between resetting the flora }
Event OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer)
endEvent
Event OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer)
 ;Trace("PLANTER - Adding " + akBaseItem + " to the Planter Container")
; 	debug.Trace(self + " has had " + akBaseItem + " added to inventory: Checking Type")
 ;If items is potion or ingredient && item is in our formlist
 if ((akBaseItem as Potion) || (akBaseItem as Ingredient)) && flPlanterPlantableMoss.hasForm(akBaseItem as form)	
; 			debug.Trace(self + " has found " + akBaseItem + " to be in the FormList: setting as planted item")
   int flIndex = 0
   while flIndex < flPlanterPlantableMoss.getSize()
    if akBaseItem == flPlanterPlantableMoss.getAt(flIndex)
     plantedItemIndex = flIndex
; 					debug.Trace(self + " index=" + plantedItemIndex)
     ;we have found the index, set incremental counter to formlist size to force kick out
     flIndex = flPlanterPlantableMoss.getSize()
    endif
    flIndex += 1
   endWhile
   if plantedItem
    self.RemoveItem(plantedItem, 1, true, Game.GetPlayer())
    plantedItem = akBaseItem
    plantedItemRef = akItemReference
; 				debug.Trace(self + " has set plantedItem to " + akBaseItem)
    utility.WaitMenuMode(0)
    PlanterPreviousItemRemovedMESSAGE.Show()
   else
    plantedItem = akBaseItem
    plantedItemRef = akItemReference
   endif
   if plantedItem
; 				debug.Trace(self + " plantedItem=" + plantedItem)
   endif
   if (aiItemCount > 1)
    self.RemoveItem(akBaseItem, (aiItemCount - 1), true, Game.GetPlayer())
    utility.WaitMenuMode(0)
    PlanterOnlyOneItemMESSAGE.Show()
   else
    PlanterItemPlantedMESSAGE.Show()
   endif
 else
  self.RemoveItem(akBaseItem, aiItemCount, true, Game.GetPlayer())
  utility.WaitMenuMode(0)
  PlanterNotPlantableMESSAGE.Show()
 endif
 if !containerProccessed
; 		debug.Trace(self + " processing container")
  containerProccessed = True
  Utility.wait(0)
  SetPlantedItem()
 endif
endEvent
Event onClose(ObjectReference akActionRef)
 (Debug.notification(self + " has been closed by " + akActionRef)
endEvent
Function SetPlantedItem()
; 	debug.trace(self + " SetPlantedItem: plantedItemIndex=" + plantedItemIndex + ", plantedFloraBase="+plantedFloraBase)
 containerProccessed = False
 if	!plantedFloraBase || plantedFloraBase != flPlanterPlantedMoss.getAt(plantedItemIndex)
  plantedFloraBase = flPlanterPlantedMoss.getAt(plantedItemIndex)
; 		debug.Trace(self + " plantedFloraBase="+plantedFloraBase)
  ; set timestamp
  plantedTimestamp = GameDaysPassed.GetValue()
  ; switch soil visual state
;		mySoilRef.playAnimation("PlayAnim02")
 endif	
endFunction
event onCellAttach()
 GrowPlantedItem()
endEvent
; call this when it's time to try to grow the planted item
function GrowPlantedItem()
; 	debug.Trace(self + "onCellAttach - check to see if anything should grow " + GameDaysPassed.GetValue() + ", plantedTimestamp=" + plantedTimestamp)
 if !plantedFloraRef && plantedItem && (GameDaysPassed.GetValue() - plantedTimestamp) >= growDays
; 		debug.Trace(self + " growing " + plantedItem)
  ; count this as the "last reset" time
  resetTimestamp = GameDaysPassed.GetValue()
  ; remove the planted item from container and place flora
  self.removeItem(plantedItem, 1)
  plantedItem = none
  plantedItemRef = none
  plantedFloraRef = mySoilRef.placeAtMe(plantedFloraBase)
  (mySoilRef as BYOHPlanterSoilMossScript).goToState("planted")
 elseif plantedFloraRef && (GameDaysPassed.GetValue() - resetTimestamp) >= resetDays
  ; if I've already placed a flora, see if it's time to reset
; 		debug.Trace(self + " resetting " + plantedFloraBase)
  ; delete existing ref
  plantedFloraRef.Delete()
  ; place a new one
  plantedFloraRef = mySoilRef.placeAtMe(plantedFloraBase)
  (mySoilRef as BYOHPlanterSoilMossScript).goToState("planted")
  ; new reset timestamp
  resetTimestamp = GameDaysPassed.GetValue()
 endif
endFunction
Message Property PlanterItemPlantedMESSAGE  Auto  

<!--spoiler_text_end-->

<!--/dle_spoiler-->


Данные скрипты есть в моем моде "Садовод-любитель" и только эта проблема мешает мне продолжить работу над модом и допилить его от альфы до релиза.

Я не могу ничего понять от слова "совсем". HELP ME!!!!!

P.S. Уважаемые администраторы сайта! ПОЧИНИТЕ СПОЙЛЕРЫ!!! КОД НЕЛЬЗЯ СПРЯТАТЬ ПОД СПОЙЛЕР, СПОЙЛЕР ПОСЛЕ ЭТОГО НЕ ОТКРЫВАЕТСЯ!



Человек человеку - волк, а зомби зомби - зомби.
Multigone  Offline  Сообщение №2 написано: 7 мая 2023, 19:04 | Отредактировано: Multigone - 7 мая 2023, 19:05



817
Stea1ch, для Вашего вопроса уже существует специально созданная тема: https://modgames.net/forum/110-9434-106

Stea1ch  Offline  Сообщение №3 написано: 7 мая 2023, 20:03



180
Цитата Multigone

уже существует специально созданная тема


Знаю, а вы почитайте последние сообщения в этой теме! Там мне не помогли с простейшими задачами, что же говорить про задачу, с которой я бьюсь уже неделю! Эта тема мертва. Так что я именно по этому создал отдельную тему, которая в случае успеха станет страничкой обсуждения мода. Как видите - это хоть как-то сработало, хотя-бы вы ответили мне, хоть и не помогли...


Человек человеку - волк, а зомби зомби - зомби.
Stea1ch  Offline  Сообщение №4 написано: 7 мая 2023, 20:15



180
Еще одна проблема, которую я не могу решить. НИГДЕ не могу найти где прописано количество ингредиентов, собираемых с посаженного растения. Все ванильные растения дают 3-5 ингредиентов за раз, а все, что я добавил - по 1 (2 с перком алхимии). Перелопатил все формлисты, глобальные переменные, скрипты, хоть как-то касающиеся домов игрока из Heathfires - нигде не могу найти правило, отвечающее за это...


Человек человеку - волк, а зомби зомби - зомби.
Multigone  Offline  Сообщение №5 написано: 7 мая 2023, 20:38 | Отредактировано: Multigone - 7 мая 2023, 20:40



817
Stea1ch, тут код превратился в кашу, непонятно, какие изменения, помимо переименования переменных, были сделаны. Если в модиф. код не было добавлено новых строк: лог говорит, что строка 34 (PlanterContainer.Activate(Game.GetPlayer(), FALSE) использует функцию Activate на объекте none. Раз PlanterContainer остался none -> скорее всего, он не заполняется функцией (18) PlanterContainer = GetLinkedRef() -> либо актер, ответственный за гифт-меню при посадке, не прилинкован к активатору, на котором висит BYOHPlanterSoilScript... либо не срабатывает эвент OnCellAttach(), при котором происходит заполнение PlanterContainer (вики говорит, что "This event will NOT fire in the first cell(s) loaded while loading from a save game" -> проверка модификации осуществляется на грязном сохранении, когда игрок загружается неподалеку от проверяемого объекта).

Multigone  Offline  Сообщение №6 написано: 7 мая 2023, 20:53 | Отредактировано: Multigone - 7 мая 2023, 20:54



817
Знаю, а вы почитайте последние сообщения в этой теме!
Ну, читал.

Цитата Stea1ch

Еще одна проблема, которую я не могу решить. НИГДЕ не могу найти где прописано количество ингредиентов, собираемых с посаженного растения. Все ванильные растения дают 3-5 ингредиентов за раз, а все, что я добавил - по 1 (2 с перком алхимии).

В скриптах, которые вешаются на MiscObject, собираемые с растений. Там происходит замена MiscObject на Potion (Ingredient) и прочие вещи.


Stea1ch  Offline  Сообщение №7 написано: 7 мая 2023, 20:53



180
Цитата Multigone

не прилинкован к активатору


В том-то и фича, что прилинкован... В консоли при клике по активатору командой GetLinkedRef я получаю правильный ид непися, находящегося в специально созданной локации хранилища для этого мода. Далее командой openactorcontainer на полученный реф я могу добавить ингредиент и получу сообщение "Растение посажено" (то есть отрабатывает второй скрипт, который на неписе, и отрабатывает полностью, то есть проходит по всем условиям и выполняет PlanterItemPlantedMESSAGE.Show() ) Не срабатывает именно ивент OnActivate и я совершенно не могу понять почему... От того, с какого сохранения я запускаюсь ничего не зависит, я был в доме, выходил на улицу и активатор так и не заработал... В скриптах изменены только ид формлистов, имена скриптов и названия переменных - вместо ItemContainer у меня MossContainer. Скрипты компилятся без ошибок, свойства автозаполняются по кнопке FillAll. Формлисты содержат TREE и ингредиенты в совпадающих индексах.


Человек человеку - волк, а зомби зомби - зомби.
Multigone  Offline  Сообщение №8 написано: 7 мая 2023, 21:07



817
Цитата Stea1ch

От того, с какого сохранения я запускаюсь ничего не зависит, я был в доме, выходил на улицу и активатор так и не заработал... В скриптах изменены только ид формлистов, имена скриптов и названия переменных - вместо ItemContainer у меня MossContainer.

Тогда непонятно, зачем множить сущности, когда и ванильный скрипт отработал бы так же, как и модифицированный (с указанием своих Property).
Нужно в ванильной игре без мода coc qasmoke, сохраниться, подключить мод, и далее лететь проверять его работу. От того, что игрок вышел на улицу из поместья, ячейка не перезагружается (?).

Stea1ch  Offline  Сообщение №9 написано: 7 мая 2023, 21:24



180
Цитата Multigone

когда и ванильный скрипт отработал бы так же


Нет, ванильный скрипт не подойдет. Этот скрипт для мха, и собственно посадочное место у него - бревно под крышей дома. Соответственно формлисты содержат только 2 вида мха (в дальнейшем еще и морозную мириам). Изначально были изменены в ванильных скриптах только названия скриптов и формлисты. Почему-то не работает кнопка репутации, так что низкий поклон вам за то, что правильно ткнули носом в мискобъекты. Все нашел, начинаю доводить мод до ума дальше, завтра будет версия 0.0.4 alpha с исправлениями.


Человек человеку - волк, а зомби зомби - зомби.
Multigone  Offline  Сообщение №10 написано: 7 мая 2023, 21:42 | Отредактировано: Multigone - 7 мая 2023, 21:50



817
Нет, ванильный скрипт не подойдет. Этот скрипт для мха, и собственно посадочное место у него - бревно под крышей дома.

Подойдет (для оговоренных изменений - "изменены только ид формлистов, имена скриптов и названия переменных"). Нужно всего лишь... указать свои форм-листы кнопкой Edit Property.

Stea1ch  Offline  Сообщение №11 написано: 7 мая 2023, 23:00



180
Цитата Multigone

указать свои форм-листы кнопкой Edit Property.


Вот я долбо...клюй! Все заработало! Уря! Сейчас протестирую все виды растений и обновлю мод!


Человек человеку - волк, а зомби зомби - зомби.
Форум » TES V: Skyrim » Мастерская » Садовод-любитель (Страничка обсуждения мода)
  • Страница 1 из 1
  • 1
Поиск:





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