Scripting Help, Add Perk on Inventory Item AddRemove

Post » Wed Jun 20, 2012 9:49 pm

What I'm trying to do is attach a script to a miscellaneous item that will add a perk when it's added to the players inventory and remove it when it's removed.

As you can probably guess, I don't exactly know what I'm doing, so any help or advice as to why this doesn't work would be great.

Also bonus points:
Pretty sure that this script (if it worked) would remove the perk from the player should an NPC happen to have a copy of the item added to their inventory. Any suggestions on how to fix that?

Latest Failure:
Scriptname ForgeTestScript extends ObjectReference  Perk Property TestPerk autoEvent OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer)  If (akSourceContainer == Game.GetPlayer())	Game.GetPlayer().AddPerk(TestPerk)  endIfEndEventEvent OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer)  If (akDestContainer != Game.GetPlayer())	Game.GetPlayer().RemovePerk(TestPerk)  endIfEndEvent
User avatar
Ian White
 
Posts: 3476
Joined: Thu Jul 19, 2007 8:08 pm

Post » Thu Jun 21, 2012 12:33 am

Scriptname ForgeTestScript extends ObjectReferencePerk Property TestPerk AutoEvent OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer)    if (akNewContainer == Game.GetPlayer())        Game.GetPlayer().AddPerk(TestPerk)    elseif (akOldContainer == Game.GetPlayer())        if (Game.GetPlayer().GetItemCount(GetBaseObject()) == 0)            Game.GetPlayer().RemovePerk(TestPerk)        endif    endifEndEvent
User avatar
u gone see
 
Posts: 3388
Joined: Tue Oct 02, 2007 2:53 pm

Post » Wed Jun 20, 2012 11:18 pm

Try http://www.creationkit.com/OnContainerChanged_-_ObjectReference:
ScriptName YourMiscObjectScript extends ObjectReference  Perk Property TestPerk AutoMiscObject Property YourMISC AutoEvent OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer)	If Game.GetPlayer().HasPerk(TestPerk) != Game.GetPlayer().GetItemCount(YourMISC)		If Game.GetPlayer().GetItemCount(YourMISC)			Game.GetPlayer().AddPerk(TestPerk)		Else			Game.GetPlayer().RemovePerk(TestPerk)		EndIf	EndIf	EndEvent

*ninja'd
User avatar
Music Show
 
Posts: 3512
Joined: Sun Sep 09, 2007 10:53 am

Post » Wed Jun 20, 2012 6:35 pm

Thanks a tonne guys! Worked a charm. :)
User avatar
Hot
 
Posts: 3433
Joined: Sat Dec 01, 2007 6:22 pm

Post » Thu Jun 21, 2012 3:10 am

A more efficient version of RandomNoob's code:
event OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer)	Actor player = Game.GetPlayer()	if (akNewContainer == player)		player.AddPerk(TestPerk)	elseif (akOldContainer == player)		if (player.GetItemCount(GetBaseObject()) == 0)			player.RemovePerk(TestPerk)		endif	endifendevent
It's important to do stuff like that in a language that isn't say C++ because Papyrus doesn't have such an amazing optimizing compiler and or a crazy optimizing VM like LuaJIT does.

It's a new product, it needs some time to grow in efficiency.
User avatar
Chenae Butler
 
Posts: 3485
Joined: Sat Feb 17, 2007 3:54 pm


Return to V - Skyrim