IsSummon

From the Oblivion ConstructionSet Wiki
Revision as of 06:59, 28 December 2009 by imported>Kyoma (Initial creation with two different methodes. The second one may be better off being removed because of the many disadvantages.)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

A User Function for use with Oblivion Script Extender

Syntax:

(isSummon:bool) reference.Call IsSummon

Returns true when the calling reference is a summon. Works by comparing the base form with the actor associated with each of the summon effects.

Notes

  • This function must be called on a reference (Ref.call <function>)
  • In theory it would return true when a summon creature is placed ingame by means other than summon spells(PlaceAtMe or drag-and-drop in the cs). Not very likely though.
  • There are two different methodes for the script, each has its own advantages and disadvantages. I highly recommend Methode 1, even if setting things up requires a bit more effort there aren't any real disadvantages.

Methode 1

  • Requires a spell (type does not matter) with each of the possible summon effects, including any that may be blank (e.g. the Z0XX effects)
  • Will work with all magic effects, as long as their effect is added to the spell mentioned above.

Methode 2

  • Does not require anything else besides the function script
  • If the mod user does not have Shivering Isles installed it won't work with alot of the Z0XX effects
    • You will need to create two versions, one for non-SI and one for SI. The problem is, if you as a modder do not have SI you won't be able to make an SI version of the script. As soon as you compile a script in the cs that uses a so-called 0 FormID, the script won't work ingame. Even if the specific line is never actually executed ingame or if another mod in your loadorder fills in the 0 FormID.
  • Does not work with the Z020 magic effect, even when you got SI.

Examples:

Check if the calling reference is a summoned actor or not(in this case an actor that is stored in the someActorRef variable).

Let bIsSummon := someActorRef.Call IsSummon

Code

Methode 1

ScriptName  IsSummon
long iMagicEff
long iMagicEffC
ref rMagicEffList

Begin Function {}
	let rMagicEffList := SummonEffectsSpell
	While iMagicEff < GetMagicItemEffectCount rMagicEffList
		let iMagicEffC := GetNthEffectItemCode rMagicEffList iMagicEff
		let iMagicEff += 1
		if iMagicEffC == 0
			Continue
		endif

		if MagicEffectUsesCreatureC iMagicEffC
			if GetBaseObject == GetMagicEffectUsedObjectC iMagicEffC
				SetFunctionValue 1
				Break
			endif
		endif
		let iMagicEffC := 0
	Loop
End 

Methode 2

ScriptName IsSummon

long iMagicEff
ref rMagicEff

Begin Function {}

	While iMagicEff < 40
		let iMagicEff += 1
		if iMagicEff == 1
			let rMagicEff := ZCLA
		elseif iMagicEff == 2
			let rMagicEff := ZDAE
		elseif iMagicEff == 3
			let rMagicEff := ZDRE
		elseif iMagicEff == 4
			let rMagicEff := ZDRL
		elseif iMagicEff == 5
			let rMagicEff := ZFIA
		elseif iMagicEff == 6
			let rMagicEff := ZFRA
		elseif iMagicEff == 7
			let rMagicEff := ZGHO
		elseif iMagicEff == 8
			let rMagicEff := ZHDZ
		elseif iMagicEff == 9
			let rMagicEff := ZLIC
		elseif iMagicEff == 10
			let rMagicEff := ZSCA
		elseif iMagicEff == 11
			let rMagicEff := ZSKA
		elseif iMagicEff == 12
			let rMagicEff := ZSKC
		elseif iMagicEff == 13
			let rMagicEff := ZSKE
		elseif iMagicEff == 14
			let rMagicEff := ZSKH
		elseif iMagicEff == 15
			let rMagicEff := ZSPD
		elseif iMagicEff == 16
			let rMagicEff := ZSTA
		elseif iMagicEff == 17
			let rMagicEff := ZWRA
		elseif iMagicEff == 18
			let rMagicEff := ZWRL
		elseif iMagicEff == 19
			let rMagicEff := ZXIV
		elseif iMagicEff == 20
			let rMagicEff := ZZOM
		elseif iMagicEff == 21
			let rMagicEff := Z001
		elseif iMagicEff == 22
			let rMagicEff := Z002
		elseif iMagicEff == 23
			let rMagicEff := Z003
		elseif iMagicEff == 24
			let rMagicEff := Z005
		endif

		;The rest of the Magic Effects are for the SI-version
		if iMagicEff == 25
			let rMagicEff := Z004
		elseif iMagicEff == 26
			let rMagicEff := Z006
		elseif iMagicEff == 27
			let rMagicEff := Z007
		elseif iMagicEff == 28
			let rMagicEff := Z008
		elseif iMagicEff == 29
			let rMagicEff := Z009
		elseif iMagicEff == 30
			let rMagicEff := Z010
		elseif iMagicEff == 31
			let rMagicEff := Z011
		elseif iMagicEff == 32
			let rMagicEff := Z012
		elseif iMagicEff == 33
			let rMagicEff := Z013
		elseif iMagicEff == 34
			let rMagicEff := Z014
		elseif iMagicEff == 35
			let rMagicEff := Z015
		elseif iMagicEff == 36
			let rMagicEff := Z016
		elseif iMagicEff == 37
			let rMagicEff := Z017
		elseif iMagicEff == 38
			let rMagicEff := Z018
		elseif iMagicEff == 39
			let rMagicEff := Z019
		endif

		if rMagicEff == 0
			Continue
		endif

		if MagicEffectUsesCreature rMagicEff
			if GetBaseObject == GetMagicEffectUsedObject rMagicEff
				SetFunctionValue 1
				Break
			endif
		endif
		let rMagicEff := 0
	Loop
End 

See Also