Jump to content

Catching OnActivate of a workbench spawned in.


Recommended Posts

I am trying to trigger the workbenchscript so my invisible workbench can access it and use items/components stored in settlements during crafting.

Function CreateFurniture(ObjectReference akFurnitureRef)
  If akFurnitureRef.HasKeyword(sc_kywd_AnimArmor)
    InvisibleFurniture = akFurnitureRef.PlaceAtMe(sc_CraftbenchArmor) 
  ElseIf akFurnitureRef.HasKeyword(sc_kywd_AnimWeapon)
    InvisibleFurniture = akFurnitureRef.PlaceAtMe(sc_CraftbenchWeapon)
  EndIf
  Utility.Wait(0.1)
  RegisterForRemoteEvent(PlayerRef, "OnGetUp")
  RegisterForRemoteEvent(InvisibleFurniture, "OnActivate")
  InvisibleFurniture.Activate(PlayerRef, True) 
EndFunction

All these works, but I'm stuck on

Event OnActivate(ObjectReference akActionRef)
EndEvent

I can't compile it. CK throws this error:

sc_qust_StartupQuest.psc(31,0): new event onactivate cannot be defined because the script is not flagged as native

I tried doing ObjectReference.OnActivate but CK threw out a different error:

sc_qust_StartupQuest.psc(31,0): the parameter types of function objectreference.onactivate in the empty state on script simplecraft:sc_qust_startupquest do not match the original script objectreference
 

Link to comment
Share on other sites

A script attached to a quest form will not receive OnActivate events from arbitrary objects.

 

SOLUTION A

That quest script needs to remote register for the event https://falloutck.uesp.net/wiki/RegisterForRemoteEvent_-_ScriptObject

example: 

Self.RegisterForRemoteEvent(akFurnitureRef, "OnActivate")

and then ...

Event ObjectReference.OnActivate(ObjectReference akSender, ObjectReference akActionRef)

;do stuff and dont forget to Self.UnregisterForRemoteEvent(akSender, "OnActivate") when complete

EndEvent

 

SOLUTION B 

Attach a script to the originating object and get its native OnActivate event to do stuff.

 

SOLUTION C

Attach a script to the originating object and get its native OnActivate event to call a function on the quest script

(pQuestName as QuestNameScript).FunctionName()

 

SOLUTION D 

Add the originating object to a quest reference alias which has an attached script that looks like B or C 

 

& etc 

 

Link to comment
Share on other sites

16 minutes ago, SKKmods said:

A script attached to a quest form will not receive OnActivate events from arbitrary objects.

That quest script needs to remote register for the event https://falloutck.uesp.net/wiki/RegisterForRemoteEvent_-_ScriptObject

example: 

Self.RegisterForRemoteEvent(akFurnitureRef, "OnActivate")

and then ...

Event ObjectReference.OnActivate(ObjectReference akSender, ObjectReference akActionRef)

;do stuff and dont forget to Self.UnregisterForRemoteEvent(akSender, "OnActivate") when complete

EndEvent

Thanks! I was doing this before I came back and checked my thread:

  RegisterForRemoteEvent(InvisibleFurniture, "OnActivate")
  If !RegisterForRemoteEvent(InvisibleFurniture, "OnActivate")
    Debug.MessageBox("Failed to Register")    
  Else
    Debug.MessageBox("Registered")    
    InvisibleFurniture.Activate(PlayerRef, True) 
  EndIf

Does it have to be akFurnitureRef? With this, I was able to compile. In-game was showing a message box with "Registered" so it seems the event is registered but OnActivate event isn't happening:

Event ObjectReference.OnActivate(ObjectReference akSender, ObjectReference akActionRef)
  Debug.MessageBox("Hello")
EndEvent
Link to comment
Share on other sites

12 minutes ago, SKKmods said:

Your best bet is to attach a script direct to InvisibleFurniture and test if that object actually triggers the OnActivate event.

Can I if it's just a variable?

;-- Variables ---------------------------------------
ObjectReference InvisibleFurniture

Link to comment
Share on other sites

1 hour ago, SKKmods said:

Attach scripts to the base forms which are creating the spawned object ... sc_craftworkbenchname things.

Ah, to the furniture themselves? They do have the workbenchscript attached. Should I try to make a different one and try OnActivate in it?

image.thumb.png.05f66ef21486d8c32168a5225ed75b46.png

And just for full disclosure, here's the current script that I have.

ScriptName SimpleCraft:sc_qust_StartupQuest Extends Quest

;-- Variables ---------------------------------------
ObjectReference InvisibleFurniture

;-- Properties --------------------------------------
Actor Property PlayerRef Auto Const
Perk Property sc_CraftPerk Auto Const
Furniture Property sc_CraftbenchArmor Auto Const
Furniture Property sc_CraftbenchWeapon Auto Const
Keyword Property sc_kywd_AnimArmor Auto Const
Keyword Property sc_kywd_AnimWeapon Auto Const

;-- Events    ---------------------------------------
Event OnQuestInit()
  If !PlayerRef.HasPerk(sc_CraftPerk)
    PlayerRef.AddPerk(sc_CraftPerk, False) 
  EndIf
EndEvent

Event Actor.OnGetUp(Actor akSender, ObjectReference akFurniture)        
  Utility.Wait(0.2) 
  InvisibleFurniture.Disable(False) 
  InvisibleFurniture.Delete() 
  UnregisterForRemoteEvent(PlayerRef, "OnGetUp") 
EndEvent

;-- Functions ---------------------------------------
Function CreateFurniture(ObjectReference akFurnitureRef)
  If akFurnitureRef.HasKeyword(sc_kywd_AnimArmor)
    InvisibleFurniture = akFurnitureRef.PlaceAtMe(sc_CraftbenchArmor) 
  ElseIf akFurnitureRef.HasKeyword(sc_kywd_AnimWeapon)
    InvisibleFurniture = akFurnitureRef.PlaceAtMe(sc_CraftbenchWeapon)
  EndIf
  Utility.Wait(0.1)
  RegisterForRemoteEvent(PlayerRef, "OnGetUp")    
  InvisibleFurniture.Activate(PlayerRef, True) 
EndFunction

 

Link to comment
Share on other sites

I fixed it now!

    WorkshopREF = akFurnitureRef.GetLinkedRef(WorkshopItemKeyword) as WorkshopScript
    InvisibleFurniture.SetLinkedRef(WorkshopREF, WorkshopItemKeyword)
    If (WorkshopREF && WorkshopREF.OwnedByPlayer == false)
        WorkshopREF.CheckOwnership()
    EndIf

 

Link to comment
Share on other sites

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...