Flowerguy360 Posted August 25, 2016 Share Posted August 25, 2016 Hey There, :) I know nothing of Papyrus. That said... ScriptName MirelurkQueenSpawnScript Extends Actor {This script is to spawn Mirelurk Spawn from the queen while she is in combat} import utility Spell Property MirelurkSpawnQueenSpell Auto Form Property xMarker Auto GlobalVariable Property MirelurkQueenDropSpawn Auto ;Weapon Property WeapMirelurkQueenEggs Auto ActorValue Property MirelurkQueenActiveSpawn Auto int Property MaxActiveSpawn = 6 Auto Actor[] MyMirelurkSpawn ImpactDataSet Property PMirelurkQueenSpitImpact Auto Const ;markie added Group SpawnProperties float Property SpawnTimerMin = 15.0 Auto float Property SpawnTimerMax = 45.0 Auto int Property SpawnNumberMin = 3 Auto int Property SpawnNumberMax = 6 Auto EndGroup int SpawnTimerID = 200 Bool CleanedUp = false Event OnTimer(int aiTimerID) debug.Trace(self + ": recieved aiTimerID >> " + aiTimerID) ;if spawn timer & in combat & not dead if aiTimerID == SpawnTimerID && GetCombatState() == 1 && !isDead() debug.Trace(self + "::: Time To Spawn Back Babies!") if MirelurkQueenDropSpawn.GetValue() == 1 FireMirelurkSpawn() Endif StartTimer(RandomFloat(SpawnTimerMin, SpawnTimerMax), SpawnTimerID) else ;debug.Trace(self + "::: Time To Spawn Back Babies!") endif EndEvent Event OnCombatStateChanged(Actor akTarget, int aeCombatState) ;0: Not in combat; 1: In combat; 2: Searching if aeCombatState == 1 debug.Trace(self + ": Starting Combat") ;start the spawn timer StartTimer(RandomFloat(SpawnTimerMin, SpawnTimerMax), SpawnTimerID) elseif aeCombatState == 0 debug.Trace(self + ": Stopping Combat") ;if we drop out of combat, cancel the timer CancelTimer(SpawnTimerID) endif EndEvent Float Offset = 512.0 Function FireMirelurkSpawn() objectReference myTarget = placeAtMe(xMarker) objectReference objSelf = self as objectReference ObjectReference FiringNode int i = 0 ;Set the random number to spawn int numToSpawn = RandomInt(SpawnNumberMin, SpawnNumberMax) debug.Trace(self + "::: Firing Back Babies >> " + numToSpawn) ;if HasNode("MagicNode") ; debug.Trace(self + "::: HAS MAGIC NODE == TRUE") ;else ; debug.Trace(self + "::: HAS MAGIC NODE == FALSE") ;endif ;check if it is more than we are allowed to have active, if so, set to the max we can do ; This actorvalue should get lowered by the mirelurks when they die ; This does NOT actually change the value, the spawn change the value on the closest queen they can find int currentActiveSpawn = (GetValue(MirelurkQueenActiveSpawn) as int) if (currentActiveSpawn + numToSpawn) > MaxActiveSpawn numToSpawn = MaxActiveSpawn - currentActiveSpawn endif ;Here we actually fire the spell while i < numToSpawn ;Move the xmarker firingNode = PlaceAtNode("NPC R MagicNode [RMag]Alt", XMarker) myTarget.MoveTo(objSelf, afXOffset = (0 - Math.Sin(GetAngleZ()) * Offset), afYOffset = (0 - Math.Cos(GetAngleZ()) * Offset), afZOffset = 256.0) ;Fire at the xmarker MirelurkSpawnQueenSpell.Cast(firingNode, myTarget) ;MirelurkSpawnQueenSpell.Cast(objSelf, myTarget) ;MirelurkSpawnQueenSpell.Cast(objSelf) ;WeapMirelurkQueenEggs.fire(objSelf, ) PlayImpactEffect(PMirelurkQueenSpitImpact, "NPC R MagicNode [RMag]Alt", 0, 0, -1, 512, false, false) firingNode.delete() i += 1 utility.wait(randomFloat(0.2, 0.9)) endWhile CleanedUp = False myTarget.Delete() Debug.Trace(Self + ": MirelurkQueenActiveSpawn == " + GetValue(MirelurkQueenActiveSpawn)) EndFunction Function SpawnBabiesDueToUnreachablePlayer() CancelTimer(SpawnTimerID) StartTimer(0.1, SpawnTimerID) EndFunction ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Baby Manager ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;TODO ; add stuff to check the length ; OnUnload crap ; Spawn Script ; ObjectReference[] Function FindAllReferencesOfType(Form arObjectOrList, float afRadius) bool Function AreYouMyMommy(Actor CurrentSpawn) Debug.Trace(Self + ": AreYouMyMommy called by >> " + CurrentSpawn) int currentActiveSpawn = (GetValue(MirelurkQueenActiveSpawn) as int) if currentActiveSpawn < MaxActiveSpawn if MyMirelurkSpawn == none MyMirelurkSpawn = New Actor[0] Endif MyMirelurkSpawn.Add(CurrentSpawn) ModValue(MirelurkQueenActiveSpawn, 1.0) RegisterForRemoteEvent(CurrentSpawn, "OnDeath") RegisterForRemoteEvent(CurrentSpawn, "OnUnload") return true else ;Too many babies! Go find a different mommy! return false endif EndFunction Event Actor.OnDeath(Actor KilledRef, Actor akKiller) ClearSpawnFromMyList(KilledRef) EndEvent Event ObjectReference.OnUnload(ObjectReference UnloadedActor) ClearSpawnFromMyList(UnloadedActor as Actor) EndEvent Function ClearSpawnFromMyList(Actor SpawnToRemove) ;NEW int i = MyMirelurkSpawn.Find(spawnToRemove) if i >= 0 MyMirelurkSpawn.Remove(i, 1) ;UnregisterForEvents UnRegisterForRemoteEvent(SpawnToRemove, "OnDeath") UnRegisterForRemoteEvent(SpawnToRemove, "OnUnload") ;Then Mod the queens actor value so she can spawn more ModValue(MirelurkQueenActiveSpawn, -1.0) if GetValue(MirelurkQueenActiveSpawn) < 0.0 SetValue(MirelurkQueenActiveSpawn, 0.0) Endif endif Debug.Trace(Self + ": MirelurkQueenActiveSpawn == " + GetValue(MirelurkQueenActiveSpawn)) EndFunction ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Clean up ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;On The Queens death, do the clean up Event OnDeath(Actor akKiller) CleanUp() EndEvent ;If the queen is unloaded, do the clean up Event OnUnload() CleanUp() EndEvent ;If we need to clean up, do so ; This should clear the array so the mirelurkSpawn can properly delete themselves Function CleanUp() if CleanedUp return else CancelTimer(SpawnTimerID) MyMirelurkSpawn = none EndIf What I am trying to do is basically make a Summon Creature spell/ability for a Companion. In the game, I have made the required Forms (EXPL, MGEF, SPEL, NPC), but I am unable to link it to the ability to my companion in a way she will use (adding it in Spell List doesn't work). My Companion should only summon one creature at a time, and the duration is for 60 seconds. I have compared my Forms to the Mirelurk Queen, and the only way in which it differs is that the Mirelurk Queen has an Aimed Delivery (mine is Targeted Location), and she uses a Projectile and I use an Explosion (and the projectile calls to an explosion) before the creature is spawned. When I looked at the Mirelurk Queen, it appears that the summon ability is somehow linked using the script, above, instead of Spell List. I know this should be a simple problem to fix, but as I said - I'm an ignorant cuss when it comes to Papyrus. Any help would be appreciated. Thanks. :) Link to comment Share on other sites More sharing options...
Recommended Posts