There are almost always ways, it just depends on how ugly you want to get.

For example, could you also get the race of the targeted actor, force that into a quest property as well, and then use a while loop in your quest script to create initially disabled copies until you get one with a matching race, and then enable that one? (Remembering to delete the invalid copies.)
Brilliant! I was thinking of exactly that sort of thing, using some sort of keyword, but Race is perfect since it's "built-in," at least in the sense it is easier to get at, having it's own command and all.
I was running some tests to see what different values looked like. For example running this:
phitametrackerS Property phitametracker AutoActorBase phiActorBaseint phiakTargetFormIDForm phiakTargetFormRace phiakTargetRaceFunction SetQuestValue(Actor akTarget) phiActorBase = akTarget.GetLeveledActorBase() phiakTargetFormID = akTarget.GetFormID() phiakTargetForm = Game.GetForm(akTarget.GetFormID()) phiakTargetRace = akTarget.GetRace() Debug.MessageBox("akTarget is " +akTarget) Debug.MessageBox("phiActorBase is " +phiActorBase) Debug.MessageBox("phiakTargetFormID is " +phiakTargetFormID) Debug.MessageBox("phiakTargetForm is " +phiakTargetForm) Debug.MessageBox("phiakTargetRace is " +phiakTargetRace)EndFunctionI determined:
akTarget =
[lvlpredatorscript <(0008453F)>]akTarget.GetLeveledActorBase() =
[ActorBase <(FF000C97)>]akTarget.GetFormID() =
542015Game.GetForm(akTarget.GetFormID()) =
[lvlpredatorscript <(0008453F)>]akTarget.GetRace() =
[Race ]That said--if you're trying to create a copy of an actor, is it really the actor base you want, or could you not pass the targeted actor as your property instead?
For generic use purposes yes, because of the way the "akTarget" Actor value is passed from the OnEffectStart Event in the MagicEffect script I am using to call the function, because of how leveled list objects are referenced, and because of how http://www.creationkit.com/GetLeveledActorBase_-_Actor works.
If you look at the above results, you can see that
akTarget (which is passed AS an Actor value from the OnEffectStart Event in the MagicEffect script) is actually the same as
Game.GetForm(akTarget.GetFormID()) where GetFormID() returns an ID of a Form as an
INT value and GetForm() the
FORM of that ID.
Therefore one can reasonably conclude the MagicEffect Event OnEventStart passes the akTarget FORM value CAST AS an Actor, if I am saying that right.
The trouble seems to be that
with Actors spawned from leveled lists this might not be an actual Actor but rather a list that spawned it, a script associated with it, etc. http://www.creationkit.com/Glossary#Form
Trying to use PlaceAtMe on such a reference frequently results in the generic "cannot be placed" error in debug traces.
However, by using GetLeveledActorBase() you can "search out" or resolve the actual ActorBase object this passed Form points to or was generated from. In the case of creatures spawned from a leveled list, this is the actual leveled list "object" or "container," however one refers to it, with a true ActorBase value, or "object reference" in old-paradigm terminology.
That is why GetLeveledActorBase() is such a useful command, because if it isn't a leveled list spawn it will return the same as GetActorBase(), and so provides a convenient filter that eliminates some extra scripting.
It is still a leveled list object mind you, so the spawn of PlaceAtMe on this ActorBase object still has whatever chance defined in that leveled list of spawning any other creature in the list instead of our target creature, which is where the race check comes in.
With a quick modification to the script it is now working as intended!
Scriptname phitametrackerS extends QuestphitametrackerS Property phitametracker AutoRace phiakTargetRaceActor phiSpawnTempRace phiSpawnRaceFunction SetQuestValue(Actor akTarget) phiakTargetRace = akTarget.GetRace() phiSpawnTemp = Game.GetPlayer().PlaceAtMe(akTarget.GetLeveledActorBase()) as Actor phiSpawnRace = phiSpawnTemp.GetRace() while phiSpawnRace != phiakTargetRace phiSpawnTemp.Disable() phiSpawnTemp.Delete() phiSpawnTemp = Game.GetPlayer().PlaceAtMe(akTarget.GetLeveledActorBase()) as Actor phiSpawnRace = phiSpawnTemp.GetRace() endwhileEndFunction