Scriptname defaultGhostScriptRefAlias extends ReferenceAlias  

EFFECTSHADER PROPERTY pGhostFXShader AUTO
FORMLIST PROPERTY pDefaultGhostWeaponFlickerList AUTO
CONTAINER PROPERTY pDefaultGhostCorpse AUTO
EXPLOSION PROPERTY pdefaultGhostDeathExplosion AUTO

BOOL PROPERTY bflicker=FALSE AUTO
{don't use this yet}

SPELL PROPERTY pGhostAbilityNew AUTO
SPELL PROPERTY pGhostResistsAbility AUTO

; //any perks you want to add
PERK PROPERTY pGhostHalfDamagePerk AUTO

BOOL PROPERTY bFade=FALSE AUTO
{makes the ghost fade out instead of explode}

; //make sure only one flash is active
BOOL bFlash=FALSE

; //the person who caused the ghost to flash
ACTOR target

EVENT onLoad()

	; // add on the abilities
	SELF.GetActorReference().addSpell(pGhostAbilityNew)
	SELF.GetActorReference().addSpell(pGhostResistsAbility)
		
	; // for some reason this makes ghostFlash work better
	IF(bFlicker)
		ghostFlash(1)
	ENDIF
	
ENDEVENT

; /////////
; //ONHIT: When the ghost is hit, if the player isnt using the proper weapon, have them fade
; /////////
EVENT onHIT(OBJECTREFERENCE akAggressor, FORM akSource, Projectile akProjectile, BOOL abPowerAttack, BOOL abSneakAttack, BOOL abBashAttack, BOOL abHitBlocked)
	
	; //if we're supposed to flicker and we're hit by a weapon without turn and we're not blocked, flash
	IF(bflicker && !pDefaultGhostWeaponFlickerList.hasForm(akSource) && !abHitBlocked && !bFlash)
		bFlash = TRUE
		target = akAggressor as ACTOR
		ghostFlash(3)
	ENDIF

ENDEVENT

; /////////
; //GHOSTFLASH: play this to flash the ghost when hit or attacking
; //
; //float time: the amount of time to be invincible
; /////////
FUNCTION ghostFlash(FLOAT time)

	; //stop the effect to keep the particles
	pGhostFXShader.stop(SELF.GetActorReference())
	SELF.GetActorReference().setGhost()
	
	; //be invincible for x seconds
	utility.wait(time)
	
	; //return the ghost to normal
	SELF.GetActorReference().setGhost(FALSE)
	SELF.GetActorReference().setAlpha(0.3)
	pGhostFXShader.play(SELF.GetActorReference())
	
	bFlash = FALSE
	
ENDFUNCTION

; /////////
; //ONDYING: On dying play an explosion to mask the ghost vanishing and being replaced by his corpse
; /////////
EVENT onDYING(ACTOR killer)
	
	IF(bFade)
		Self.GetActorReference().disable(1)
	ELSE
		; //play this explosion on death
		SELF.GetActorReference().placeAtMe(pDefaultGhostDeathExplosion)
		
		; //mask the swap in the explosion
		utility.wait(0.2)
		
		; //temporary hack
		Self.GetActorReference().disable()
	ENDIF
		
	Self.GetActorReference().placeAtMe(pDefaultGhostCorpse)
	
ENDEVENT