-- LUA Script - precede every function and global member with lowercase name of script + '_main' -- Default script - does nothing. local animationSpeed = {} local animSet = {} local speed = {} local speedSet = {} local timer = {} local timer2 = {} local timer3 = {} local leader local randomHeight = {} local randomRange = {} local speedFlee = {} local speedSwim = {} function flock_follower_init(e) animationSpeed[e] = 1 animSet[e] = 0 speed[e] = 30 speedSet[e] = 0 leader = 1 timer[e] = 0 timer2[e] = 0 timer3[e] = 0 leader = 1 randomHeight[e] = 0 randomRange[e] = 0 speedFlee[e] = 0 speedSwim[e] =30 end function flock_follower_main(e) CollisionOff(e) if GetTimer(e) > timer[e] + 5000 then randomHeight[e] = math.random(-20, 20) randomRange[e] = math.random(-20,20) speedFlee[e] = 150 + math.random(-50,50) + e speedSwim[e] = 30+ math.random(-5,5) timer[e] = GetTimer(e) end if g_Entity[e]['y'] < GetTerrainHeight(g_Entity[e]['x'],g_Entity[e]['z']) + 5 then MoveUp(e,10) end if g_Entity[e]['y'] < (g_Entity[leader]['y'] + randomHeight[e]) then MoveUp(e,5) end if g_Entity[e]['y'] > (g_Entity[leader]['y'] + randomHeight[e]) then MoveUp(e,-5) end if animSet[e] == 0 then animationSpeed[e] = math.random(1,10) ModulateSpeed(e,(1+1/animationSpeed[e])) animSet[e]=1 end if speedSet[e] == 0 then speed[e] = 30+ math.random(0,5) speedSet[e] = 1 end if LeaderDistance(e) > 150 then SetAnimationSpeedModulation(e,3) CollisionOff(e) speed[e] = speedFlee[e] CollisionOn(e) else SetAnimationSpeedModulation(e,1) CollisionOff(e) speed[e] = speedSwim[e] CollisionOn(e) end RotateToPointSlowly(e,g_Entity[leader]['x']+randomRange[e],g_Entity[leader]['z']+ randomRange[e],2) MoveForward(e,speed[e]) end function LeaderDistance(e) if g_Entity[e] ~= nil and g_Entity[leader] ~= 0 then local disx = g_Entity[e]['x'] - g_Entity[leader]['x'] local disz = g_Entity[e]['z'] - g_Entity[leader]['z'] return math.sqrt(disx^2 + disz^2) end end function RotateToPointSlowly(e,x,z,v) if g_Entity[e] ~= nil and x > 0 and z > 0 then if v == nil then v = 1 end local destx = x - g_Entity[e]['x'] local destz = z - g_Entity[e]['z'] local angleneeded = math.atan2(destx,destz) angleneeded = angleneeded * (180.0 / math.pi) if angleneeded < 0 then angleneeded = 360 + angleneeded elseif angleneeded > 360 then angleneeded = angleneeded - 360 end local current_angy = g_Entity[e]['angley'] while current_angy < 0 or current_angy > 360 do if current_angy <= 0 then current_angy = 360 + current_angy elseif current_angy > 360 then current_angy = current_angy - 360 end end local L = angleneeded - v local R = angleneeded + v if L <= 0 then L = 360 + L elseif L > 360 then L = L - 360 end if R <= 0 then R = 360 + R elseif R > 360 then R = R - 360 end --if not already facing the target direction (+/- the rotation speed) if current_angy < L or current_angy > R then --do it in 2 halfs so we can account for 0/360 wrap if current_angy > 180 then if angleneeded > current_angy - 180 and angleneeded < current_angy then current_angy = current_angy - v else current_angy = current_angy + v end else if angleneeded < current_angy + 180 and angleneeded > current_angy then current_angy = current_angy + v else current_angy = current_angy - v end end SetRotation(e,0,current_angy,0) return current_angy end end end