-- LUA Script - precede every function and global member with lowercase name of script + '_main' -- Default script - does nothing. g_herd_list = {} g_herd_name = {} function herd_member_init_name(e, name) g_herd_name[e] = {name = name, leader = nil} CharacterControlUnarmed(e) end function herd_member_main(e) if not scheduler(e) then return end local Entity = g_Entity[e] if g_herd_list[e] == nil then g_herd_list[e] = {Leader = false, TargX = 0, TargZ = 0, State = 0, Ctime = 0, Moving = false}; Entity.timer = 0 end local Entity = g_Entity[e] local HL = g_herd_list[e] local eX, eZ = Entity.x, Entity.z local EntObjNo = Entity.obj; local gtime = g_Time local etime = gtime - Entity.timer local leader = g_herd_name[e].leader if HL.Ctime == 0 then HL.Ctime = math.random(5000, 15000) end if (not HL.Moving and etime > HL.Ctime) or (leader ~= nil and g_herd_list[leader].State == 2) then if leader == nil then for k, _ in pairs(g_herd_list) do if g_herd_list[k].Leader and (g_herd_name[k].name == g_herd_name[e].name) then g_herd_name[e].leader = k leader = g_herd_name[e].leader break end end end if leader ~= nil then HL.TargX, HL.TargZ = RandomPos(g_Entity[leader].x, g_Entity[leader].z, 300) CharacterControlStand(e) if g_herd_list[leader].State == 2 then HL.State = 2 SetCharacterToRun(e) else HL.State = 0 SetCharacterToWalk(e) end AIEntityGoToPosition(EntObjNo, HL.TargX, HL.TargZ) Entity.timer = gtime HL.Moving = true HL.Ctime = 0 end elseif HL.Moving then local DX, DZ = eX - HL.TargX, eZ - HL.TargZ local dist = (DX*DX) + (DZ*DZ) if dist < 6000 then HL.Moving = false Entity.timer = gtime if leader ~= nil then if g_herd_list[leader].State == 2 then HL.State = 2 HL.Ctime = 10 elseif g_herd_list[leader].State == 1 then HL.State = 1 CharacterControlDucked(e) HL.Ctime = 0 else HL.State = 0 HL.Ctime = 0 CharacterControlStand(e) end end elseif dist > (800 * 800) or (leader ~= nil and g_herd_list[leader].State == 2) then CharacterControlStand(e) SetCharacterToRun(e) AIEntityGoToPosition(EntObjNo, HL.TargX, HL.TargZ) else SetCharacterToWalk(e) AIEntityGoToPosition(EntObjNo, HL.TargX, HL.TargZ) end end if leader ~= nil and HL.State ~= 2 then if g_herd_list[leader].State == 2 then -- flee HL.State = 2 HL.Ctime = 10 -- i.e do next call Entity.timer = gtime HL.Moving = false end end -- if HL ~= nil and leader ~= nil then -- local moving = "False" -- if HL.Moving then moving = "True" end -- -- PromptLocal(e, "State=" .. HL.State .. -- ", LdrState=" .. g_herd_list[leader].State .. -- ", Mvg=" .. moving .. -- ", TMR=" .. HL.Ctime .. ", E=" .. etime); -- end end