Всем ку! Бьюсь уже неделю и не могу вообще ничего понять: полностью копирую нативную систему посадки растений, состаяющую из 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
MultigoneOffline
Сообщение №2
написано: 7 мая 2023, 19:04
| Отредактировано: Multigone - 7 мая 2023, 19:05
Знаю, а вы почитайте последние сообщения в этой теме! Там мне не помогли с простейшими задачами, что же говорить про задачу, с которой я бьюсь уже неделю! Эта тема мертва. Так что я именно по этому создал отдельную тему, которая в случае успеха станет страничкой обсуждения мода. Как видите - это хоть как-то сработало, хотя-бы вы ответили мне, хоть и не помогли...
Еще одна проблема, которую я не могу решить. НИГДЕ не могу найти где прописано количество ингредиентов, собираемых с посаженного растения. Все ванильные растения дают 3-5 ингредиентов за раз, а все, что я добавил - по 1 (2 с перком алхимии). Перелопатил все формлисты, глобальные переменные, скрипты, хоть как-то касающиеся домов игрока из Heathfires - нигде не могу найти правило, отвечающее за это...
Человек человеку - волк, а зомби зомби - зомби.
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №5
написано: 7 мая 2023, 20:38
| Отредактировано: Multigone - 7 мая 2023, 20:40
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
MultigoneOffline
Сообщение №6
написано: 7 мая 2023, 20:53
| Отредактировано: Multigone - 7 мая 2023, 20:54
Знаю, а вы почитайте последние сообщения в этой теме!
Ну, читал.
Цитата Stea1ch
Еще одна проблема, которую я не могу решить. НИГДЕ не могу найти где прописано количество ингредиентов, собираемых с посаженного растения. Все ванильные растения дают 3-5 ингредиентов за раз, а все, что я добавил - по 1 (2 с перком алхимии).
В скриптах, которые вешаются на MiscObject, собираемые с растений. Там происходит замена MiscObject на Potion (Ingredient) и прочие вещи.
В том-то и фича, что прилинкован... В консоли при клике по активатору командой GetLinkedRef я получаю правильный ид непися, находящегося в специально созданной локации хранилища для этого мода. Далее командой openactorcontainer на полученный реф я могу добавить ингредиент и получу сообщение "Растение посажено" (то есть отрабатывает второй скрипт, который на неписе, и отрабатывает полностью, то есть проходит по всем условиям и выполняет PlanterItemPlantedMESSAGE.Show() ) Не срабатывает именно ивент OnActivate и я совершенно не могу понять почему... От того, с какого сохранения я запускаюсь ничего не зависит, я был в доме, выходил на улицу и активатор так и не заработал... В скриптах изменены только ид формлистов, имена скриптов и названия переменных - вместо ItemContainer у меня MossContainer. Скрипты компилятся без ошибок, свойства автозаполняются по кнопке FillAll. Формлисты содержат TREE и ингредиенты в совпадающих индексах.
Цитата Stea1chОт того, с какого сохранения я запускаюсь ничего не зависит, я был в доме, выходил на улицу и активатор так и не заработал... В скриптах изменены только ид формлистов, имена скриптов и названия переменных - вместо ItemContainer у меня MossContainer.
Тогда непонятно, зачем множить сущности, когда и ванильный скрипт отработал бы так же, как и модифицированный (с указанием своих Property).
Нужно в ванильной игре без мода coc qasmoke, сохраниться, подключить мод, и далее лететь проверять его работу. От того, что игрок вышел на улицу из поместья, ячейка не перезагружается (?).
Нет, ванильный скрипт не подойдет. Этот скрипт для мха, и собственно посадочное место у него - бревно под крышей дома. Соответственно формлисты содержат только 2 вида мха (в дальнейшем еще и морозную мириам). Изначально были изменены в ванильных скриптах только названия скриптов и формлисты. Почему-то не работает кнопка репутации, так что низкий поклон вам за то, что правильно ткнули носом в мискобъекты. Все нашел, начинаю доводить мод до ума дальше, завтра будет версия 0.0.4 alpha с исправлениями.
Человек человеку - волк, а зомби зомби - зомби.
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №10
написано: 7 мая 2023, 21:42
| Отредактировано: Multigone - 7 мая 2023, 21:50
Нет, ванильный скрипт не подойдет. Этот скрипт для мха, и собственно посадочное место у него - бревно под крышей дома.
Подойдет (для оговоренных изменений - "изменены только ид формлистов, имена скриптов и названия переменных"). Нужно всего лишь... указать свои форм-листы кнопкой Edit Property.