state = {} first_bomb = nil local first_bomb = {} local last_bomb = {} local bombs = {} local bomb = {} local dropped = {} local distance = {} local new_speed = 0 local b = 0 local c = 0 local dropx = {} local dropz = {} --bomber travel speed bomber_speed = 1000 --how fast the bombs fall drop_speed = 400 --height to start bomber at local height = 800 --how far away from trigger point to start dropping bombs (note they will travel forwards a bit still) --if you have a lot of bombs it's a good idea to start dropping earlier local drop_range = 950 --delay between each bomb being unloaded local time_between_drops = 700 function airstrike_bomber_friendly_init_name(e,name) weapon_name[e] = name state[e] = "wait" Hide(e) dropped[e] = 0 end function airstrike_bomber_friendly_main(e) --optional scale if your bomber model is big --Scale(e,20) if bombs[e] == nil then Prompt("no bombs for bomber "..weapon_name[e]) for a = 1,9999 do if g_Entity[a] ~= nil then if weapon_name[a] ~= nil then if GetFlatDistance(e,a) < 200 then if weapon_name[a] == "air strike bomb" then b = b + 1 if first_bomb[e] == nil then first_bomb[e] = b end bomb[b] = a last_bomb[e] = b bombs[e] = 1 end end end end if a == max_bomb then end end CollisionOff(e) SetPosition(e,g_Entity[e]['x'],g_Entity[e]['y']+height,g_Entity[e]['z']) else if state[e] == "active" then LoopSound(e,0) Show(e) RotateToPoint(e,bomber_destx[e],bomber_destz[e]) dropx[e] = bomber_destx[e] dropz[e] = bomber_destz[e] for a = first_bomb[e],last_bomb[e] do RotateToPoint(bomb[a],bomber_destx[e],bomber_destz[e]) end state[e] = "fly" new_speed = bomber_speed distance[e] = GetDistanceToPoint(e,bomber_destx[e],bomber_destz[e]) elseif state[e] == "fly" then MoveForward(e,new_speed) if GetDropFlatDistance(e) < drop_range and dropped[e] == 0 then new_speed = bomber_speed / 2 for a = first_bomb[e],last_bomb[e] do if state[bomb[a]] == "wait" then if GetTimer(e) > time_between_drops then StartTimer(e) state[bomb[a]] = "dropped" PlaySound(e,1) if a == last_bomb[e] then dropped[e] = 1 new_speed = bomber_speed end break end end end end for a = first_bomb[e],last_bomb[e] do if state[bomb[a]] == "wait" then SetPosition(bomb[a],g_Entity[e]['x'],g_Entity[e]['y'],g_Entity[e]['z']) end end if dropped[e] == 1 then if GetDistanceToPoint(e,bomber_destx[e],bomber_destz[e]) > distance[e] then StopSound(e,0) Hide(e) Destroy(e) end end --dropped end --state end --bombs loaded end --main function airstrike_bomber_friendly_exit(e) end function GetFlatDistance(e,v) if g_Entity[e] ~= nil and g_Entity[v] ~= nil then local distDX = g_Entity[e]['x'] - g_Entity[v]['x'] local distDZ = g_Entity[e]['z'] - g_Entity[v]['z'] return math.sqrt((distDX*distDX)+(distDZ*distDZ)); end end function GetDropFlatDistance(e) local tdx = g_Entity[e]['x'] - dropx[e] local tdz = g_Entity[e]['z'] - dropz[e] return math.sqrt((tdx*tdx)+(tdz*tdz)) end function GetDistanceToPoint(e,x,z) if g_Entity[e] ~= nil and g_Entity[e] ~= 0 then local disx = g_Entity[e]['x'] - x local disz = g_Entity[e]['z'] - z return math.sqrt(disx^2 + disz^2) end end function RotateToPoint(e,x,z) if g_Entity[e] ~= nil and x > 0 and z > 0 then local destx = x - g_Entity[e]['x'] local destz = z - g_Entity[e]['z'] local angle = math.atan2(destx,destz) angle = angle * (180.0 / math.pi) if angle < 0 then angle = 360 + angle elseif angle > 360 then angle = angle - 360 end SetRotation(e,0,angle,0) return angle end end