And this to the Fantasy script.
attackdistance = {}
attackstart = {}
attackend = {}
attacktype = {}
viewrange = {}
damageframestart = {}
damageframeend = {}
lastroar = {}
lastswipe = {}
flamedecal = {}
local decals = {}
function ai_fantasycharacter_skeleton_init(e)
flamedecal[e]= 2
ai_soldier_state[e] = "patrol"
ai_soldier_pathindex[e] = -1
SetAnimationFrames(20010,20137)
LoopAnimation(e)
ModulateSpeed(e,1.0)
SetAnimationSpeed(e,1.0)
attackdistance[e]=65
attackstart[e]=20785
attackend[e]=20825
attacktype[e]=0
damageframestart[e]=20803
damageframeend[e]=20808
lastroar[e] = 0
lastswipe[e] = 0
ai_old_health[e] = -1
SetCharacterSoundSet(e)
end
function ai_fantasycharacter_skeleton_main(e)
local decal = decals[ e ]
if decal == nil and getDecal ~= nil then
decals[ e ] = getDecal()
return
else
-- position decal here
end
PlayerDist = GetPlayerDistance(e)
EntObjNo = g_Entity[e]['obj']
if viewrange[e]==nil then
viewrange[e] = AIGetEntityViewRange(EntObjNo)
end
if ai_soldier_state[e] == "patrol" then
if ai_soldier_pathindex[e] == -1 then
ai_soldier_pathindex[e] = -2
CharacterControlArmed(e)
PathIndex = -1
PathPointIndex = -1
pClosest = 99999
for pa = 1, AIGetTotalPaths(), 1 do
for po = 1 , AIGetPathCountPoints(pa), 1 do
pDX = g_Entity[e]['x'] - AIPathGetPointX(pa,po)
pDZ = g_Entity[e]['z'] - AIPathGetPointZ(pa,po)
pDist = math.sqrt(math.abs(pDX*pDX)+math.abs(pDZ*pDZ))
if pDist < pClosest and pDist < 200 then
pClosest = pDist
PathIndex = pa
PathPointIndex = po
end
end -- po
end -- pa
if PathIndex > -1 then
ai_soldier_pathindex[e] = PathIndex
ai_path_point_index[e] = PathPointIndex
ModulateSpeed(e,1.0)
SetCharacterToWalk(e)
ai_path_point_direction[e] = 1
ai_path_point_max[e] = AIGetPathCountPoints(ai_soldier_pathindex[e])
end
end
if ai_soldier_pathindex[e] > -1 then
ai_patrol_x[e] = AIPathGetPointX(ai_soldier_pathindex[e],ai_path_point_index[e])
ai_patrol_z[e] = AIPathGetPointZ(ai_soldier_pathindex[e],ai_path_point_index[e])
AIEntityGoToPosition(EntObjNo,ai_patrol_x[e],ai_patrol_z[e])
tDistX = g_Entity[e]['x'] - ai_patrol_x[e]
tDistZ = g_Entity[e]['z'] - ai_patrol_z[e]
DistFromPath = math.sqrt(math.abs(tDistX*tDistX)+math.abs(tDistZ*tDistZ))
if DistFromPath < 50 then
if ai_path_point_direction[e] == 1 then
ai_path_point_index[e] = ai_path_point_index[e] + 1
if ( ai_path_point_index[e] > ai_path_point_max[e] ) then
ai_path_point_index[e] = ai_path_point_max[e] - 1
ai_path_point_direction[e] = 0
end
else
ai_path_point_index[e] = ai_path_point_index[e] - 1
if ( ai_path_point_index[e] < 1 ) then
ai_path_point_index[e] = 2
ai_path_point_direction[e] = 1
end
end
end
end
end
if PlayerDist < viewrange[e] then
if GetPlayerDistance(e)<attackdistance[e] and g_PlayerHealth>0 then
if ai_soldier_state[e] ~= "attack" then
AIEntityStop(EntObjNo)
ai_soldier_state[e] = "attack"
CharacterControlLimbo(e)
attacktype[e] = 1
SetAnimationFrames(attackstart[e],attackend[e])
PlayAnimation(e)
lastswipe[e] = 0
else
if lastswipe[e]==0 and GetAnimationFrame(e)<attackend[e]-1 then
lastswipe[e]=1
end
if lastswipe[e]==1 and GetAnimationFrame(e)>=attackend[e]-1 then
ai_soldier_state[e] = "patrol"
StopAnimation(e)
lastswipe[e]=2
end
end
else
if ai_soldier_state[e] == "attack" then
if GetAnimationFrame(e)<attackstart[e] or GetAnimationFrame(e)>=attackend[e]-1 then
ai_soldier_state[e] = "patrol"
StopAnimation(e)
end
else
if ai_soldier_state[e] ~= "charge" then
ai_soldier_state[e] = "charge"
CharacterControlArmed(e)
SetCharacterToWalk(e)
ModulateSpeed(e,1.5)
if lastroar[e]==0 then
PlayCharacterSound(e,"onAlert")
lastroar[e]=1
end
end
end
end
if ai_soldier_state[e] == "charge" then
RotateToPlayer(e)
AIEntityGoToPosition(EntObjNo,g_PlayerPosX,g_PlayerPosZ)
Spawn(flamedecal[e])
CollisionOff(flamedecal[e])
SetPosition(flamedecal[e],GetEntityPositionX(e),GetEntityPositionY(e)+50,GetEntityPositionZ(e))
end
if ai_soldier_state[e] == "attack" then
RotateToPlayer(e)
if GetAnimationFrame(e)>damageframestart[e] and GetAnimationFrame(e)<damageframeend[e] then
if attacktype[e] ~= 0 then
PlaySound(e,1)
tdamage = 1+math.random(damageframeend[e]-damageframestart[e])
if attacktype[e]==2 then tdamage=tdamage*2 end
HurtPlayer(e,tdamage)
attacktype[e]=0
end
end
end
end
if ai_old_health[e]==-1 then
ai_old_health[e] = g_Entity[e]['health']
end
if g_Entity[e]['health'] < ai_old_health[e] then
ai_old_health[e] = g_Entity[e]['health']
PlayCharacterSound(e,"onHurt")
end
if PlayerDist >= viewrange[e] and ai_soldier_state[e]~="patrol" then
ai_soldier_state[e] = "patrol"
SetCharacterToWalk(e)
ModulateSpeed(e,1.0)
end
if string.find(string.lower(g_Entity[e]['limbhit']), "head") ~= nil then
SetEntityHealth(e,0)
ResetLimbHit(e)
end
end
function ai_fantasycharacter_skeleton_exit(e)
PlayCharacterSound(e,"onDeath")
CollisionOff(e)
Hide(flamedecal[e])
end