Hello
I wanted my fantasy character to attack only in self defense situation.
So I added a initialAiHealth variable which is initalized with the initial ai health.
The Fantasy Character will attack only if his health is modified down.
if GetPlayerDistance(e)<100 and g_Entity[e]['health'] < initialAIHealth then
-- LUA Script - precede every function and global member with lowercase name of script
attackstart = {}
attackend = {}
damageframestart = {}
damageframeend = {}
lastroar = {}
lastswipe = {}
function ai_fantasycharacter2_init(e)
ai_soldier_state[e] = "patrol"
ai_soldier_pathindex[e] = -1
CharacterControlLimbo(e)
SetAnimationFrames(236,265)
LoopAnimation(e)
ModulateSpeed(e,1.0)
SetAnimationSpeed(e,1.0)
attackstart[e]=160
attackend[e]=189
damageframestart[e]=170
damageframeend[e]=180
lastroar[e] = 0
lastswipe[e] = 0
ai_old_health[e] = -1
SetCharacterSoundSet(e)
end
function ai_fantasycharacter2_main(e)
if initialAiHealth == nil then
initialAiHealth = g_Entity[e]['health']
end
currentAiHealth = g_Entity[e]['health']
PlayerDist = GetPlayerDistance(e)
EntObjNo = g_Entity[e]['obj']
if ai_soldier_state[e] == "patrol" then
if ai_soldier_pathindex[e] == -1 then
ai_soldier_pathindex[e] = -2
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
CharacterControlArmed(e)
SetCharacterToWalk(e)
ModulateSpeed(e,0.65)
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 < 900 then
if GetPlayerDistance(e)<100 and g_Entity[e]['health'] == initialAiHealth then
PromptDuration("Get out of here!",3000)
end
if GetPlayerDistance(e)<100 and g_Entity[e]['health'] < initialAiHealth then
if ai_soldier_state[e] ~= "attack" then
AIEntityStop(EntObjNo)
ai_soldier_state[e] = "attack"
CharacterControlLimbo(e)
SetAnimationFrames(160,189)
LoopAnimation(e)
lastswipe[e]=0
end
else
if ai_soldier_state[e] ~= "charge" then
ai_soldier_state[e] = "charge"
CharacterControlArmed(e)
SetCharacterToWalk(e)
ModulateSpeed(e,1.5)
end
end
if ai_soldier_state[e] == "charge" then
RotateToPlayer(e)
AIEntityGoToPosition(EntObjNo,g_PlayerPosX,g_PlayerPosZ)
end
if ai_soldier_state[e] == "attack" then
RotateToPlayer(e)
if GetAnimationFrame(e)>damageframestart[e] and GetAnimationFrame(e)<damageframeend[e] then
if GetPlayerDistance(e)<120 and lastswipe[e]==0 then
PlaySound(e,1)
HurtPlayer(e,g_Entity[e]['health']/4)
lastswipe[e]=1
end
end
if GetAnimationFrame(e)<damageframestart[e] then
lastswipe[e]=0
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
--Prompt ( "PlayerDist=" .. PlayerDist .. " ai_soldier_state=" .. ai_soldier_state[e] )
if PlayerDist >= 900 and ai_soldier_state[e]~="patrol" then
ai_soldier_state[e] = "patrol"
CharacterControlLimbo(e)
SetAnimationFrames(236,265)
LoopAnimation(e)
ModulateSpeed(e,1.0)
SetAnimationSpeed(e,1.0)
end
end
function ai_fantasycharacter2_exit(e)
PlayCharacterSound(e,"onDeath")
CollisionOff(e)
end