local enter_range = {} local enter_angle = {} local pos_mod = {} local pos_y = {} local pos_x = nil local pos_z = nil local posy = nil local state = {} local speed = {} local max_speed = {} local min_speed = {} local turn_speed = {} local acceleration = {} local decceleration = {} local impact_range = {} local impact_angle = {} local angle_mod = {} local health = {} local hover_height = {} local hover_speed = {} local old_health = nil local vpressed = 0 --sound0 = engine idling --sound1 = engine running (accleration) --sound2 = take off / land function vehicle_gunner_init(e) enter_range[e] = 200 --how close player needs to be to mount the vehicle enter_angle[e] = 35 --player looking at the vehicle (smaller = tighter angle) pos_mod[e] = -60 --how far back/forward in the vehicle the player will be (negative value = backwards) pos_y[e] = 90 --how high above/below the vehicle height the player will be max_speed[e] = 75 --top speed for the vehicle min_speed[e] = -20 --top reversing speed acceleration[e] = 1 --how quickly the vehicle gains speed (in reverse too) decceleration[e] = 0.15 --how quickly the vehicle slows down if player not pressing W or S turn_speed[e] = 0.3 --how quickly the vehicle turns impact_range[e] = 200 --when enemies will get run over impact_angle[e] = 20 --adjusts angle for when enemies will get run over (smaller value = narrow vehicle) health[e] = 1000 --how much health to give vehicle (adjusts player health while in the vehicle) angle_mod[e] = 0 --if you want the player to face a different direction (other than forward) when first entering the vehicle hover_height[e] = 100 --how far above terrain to hover (full height) hover_speed[e] = 0.1 --how fast to rise up/down when player gets in/out state[e] = "wait" speed[e] = 0 end function vehicle_gunner_main(e) if state[e] == "wait" then if PlayerLooking(e,enter_range[e],enter_angle[e]) == 1 then Prompt("Mount the gun? *E*") if g_KeyPressE == 1 and vpressed == 0 then vpressed = 1 old_health = g_PlayerHealth SetPlayerHealth(health[e]) new_y = math.rad(g_Entity[e]['angley']) pos_x = g_Entity[e]['x'] + (math.sin(new_y) * pos_mod[e]) pos_z = g_Entity[e]['z'] + (math.cos(new_y) * pos_mod[e]) SetFreezePosition(pos_x,g_Entity[e]['y']+pos_y[e],pos_z) SetFreezeAngle(g_Entity[e]['anglex'],g_Entity[e]['angley']+angle_mod[e],g_Entity[e]['anglez']) TransportToFreezePosition() state[e] = "hover" end end elseif state[e] == "hover" then StopSound(e,0) StopSound(e,1) PlaySoundIfSilent(e,2) if g_Entity[e]['y'] < GetTerrainHeight(g_Entity[e]['x'],g_Entity[e]['z']) +hover_height[e] then CollisionOff(e) pos_x = g_Entity[e]['x'] pos_z = g_Entity[e]['z'] posy = g_Entity[e]['y']+hover_speed[e] SetPosition(e,pos_x,posy,pos_z) SetFreezePosition(pos_x,g_Entity[e]['y']+pos_y[e],pos_z) TransportToFreezePositionOnly() --Text(50,80,3,posy) else state[e] = "drive" end elseif state[e] == "drive" then new_y = math.rad(g_Entity[e]['angley']) pos_x = g_Entity[e]['x'] + (math.sin(new_y) * pos_mod[e]) pos_z = g_Entity[e]['z'] + (math.cos(new_y) * pos_mod[e]) SetFreezePosition(pos_x,g_Entity[e]['y']+pos_y[e],pos_z) TransportToFreezePositionOnly() if g_KeyPressW == 1 then StopSound(e,0) LoopSound(e,1) if speed[e] < max_speed[e] then speed[e] = speed[e] + acceleration[e] else speed[e] = max_speed[e] end elseif g_KeyPressS == 1 then StopSound(e,0) LoopSound(e,1) if speed[e] > min_speed[e] then speed[e] = speed[e] - acceleration[e] else speed[e] = min_speed[e] end else StopSound(e,1) LoopSound(e,0) if speed[e] > 0 then speed[e] = speed[e] - decceleration[e] elseif speed[e] < 0 then speed[e] = speed[e] + decceleration[e] else end end CollisionOff(e) new_y = math.rad(g_Entity[e]['angley']) pos_x = g_Entity[e]['x'] + (math.sin(new_y) * (speed[e]/10)) pos_z = g_Entity[e]['z'] + (math.cos(new_y) * (speed[e]/10)) posy = GetTerrainHeight(pos_x,pos_z)+hover_height[e] SetPosition(e,pos_x,posy,pos_z) if g_KeyPressA == 1 then SetRotation(e,g_Entity[e]['anglex'],g_Entity[e]['angley']-turn_speed[e],g_Entity[e]['anglez']) elseif g_KeyPressD == 1 then SetRotation(e,g_Entity[e]['anglex'],g_Entity[e]['angley']+turn_speed[e],g_Entity[e]['anglez']) end if speed[e] > 0 - (max_speed[e]/10) and speed[e] < 0 + (max_speed[e]/10) then Prompt("Leave the gun? *E*") else if GetTimer(e) > 50 then StartTimer(e) for a = 1,9999 do if g_Entity[a] ~= nil then if ai_soldier_state[a] ~= nil then if g_Entity[a]['health'] > 0 then if (EntityLooking(e,a,impact_range[e],impact_angle[e]) == 1 and speed[e] > 0) or (EntityLooking(e,a,impact_range[e],360-impact_angle[e]) == 0 and GetDistance(e,a) < impact_range[e] and speed[e] < 0) then SetEntityHealth(a,0) SetEntityRagdollForce(a,"head",g_Entity[a]['x']-g_Entity[e]['x'],10,g_Entity[a]['z']-g_Entity[e]['z'],math.random(math.abs(speed[e])*100,math.abs(speed[e])*150)) end end end end end end end if g_KeyPressE == 1 and speed[e] > 0 - (max_speed[e]/10) and speed[e] < 0 + (max_speed[e]/10) and vpressed == 0 then vpressed = 1 speed[e] = 0 state[e] = "go down" end if g_PlayerHealth < 1 then SetEntityHealth(e,0) end elseif state[e] == "go down" then StopSound(e,0) StopSound(e,1) PlaySoundIfSilent(e,2) if g_Entity[e]['y'] > GetTerrainHeight(g_Entity[e]['x'],g_Entity[e]['z']) then CollisionOff(e) pos_x = g_Entity[e]['x'] pos_z = g_Entity[e]['z'] posy = g_Entity[e]['y']-hover_speed[e] SetPosition(e,pos_x,posy,pos_z) SetFreezePosition(pos_x,g_Entity[e]['y']+pos_y[e],pos_z) TransportToFreezePositionOnly() else health[e] = g_PlayerHealth CollisionOn(e) SetPlayerHealth(old_health) state[e] = "wait" end end if g_KeyPressE == 0 then vpressed = 0 end --Prompt(state[e]) end function vehicle_gunner_exit(e) end function PlayerLooking(e,dis,v) if g_Entity[e] ~= nil then if dis == nil then dis = 3000 end if v == nil then v = 0.5 end if GetPlayerDistance(e) <= dis then local destx = g_Entity[e]['x'] - g_PlayerPosX local destz = g_Entity[e]['z'] - g_PlayerPosZ 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 while g_PlayerAngY < 0 or g_PlayerAngY > 360 do if g_PlayerAngY <= 0 then g_PlayerAngY = 360 + g_PlayerAngY elseif g_PlayerAngY > 360 then g_PlayerAngY = g_PlayerAngY - 360 end end local L = angle - v local R = angle + 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 (L < R and math.abs(g_PlayerAngY) > L and math.abs(g_PlayerAngY) < R) then return 1 elseif (L > R and (math.abs(g_PlayerAngY) > L or math.abs(g_PlayerAngY) < R)) then return 1 else return 0 end else return 0 end end end function EntityLooking(e,t,dis,v) if g_Entity[e] ~= nil and g_Entity[t] ~= nil then if dis == nil then dis = 3000 end if v == nil then v = 0.5 end local destx = g_Entity[t]['x'] - g_Entity[e]['x'] local destz = g_Entity[t]['z'] - g_Entity[e]['z'] if math.sqrt((destx*destx)+(destz*destz)) <= dis then 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 while g_Entity[e]['angley'] < 0 or g_Entity[e]['angley'] > 360 do if g_Entity[e]['angley'] <= 0 then g_Entity[e]['angley'] = 360 + g_Entity[e]['angley'] elseif g_Entity[e]['angley'] > 360 then g_Entity[e]['angley'] = g_Entity[e]['angley'] - 360 end end local L = angle - v local R = angle + 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 (L < R and math.abs(g_Entity[e]['angley']) > L and math.abs(g_Entity[e]['angley']) < R) then return 1 elseif (L > R and (math.abs(g_Entity[e]['angley']) > L or math.abs(g_Entity[e]['angley']) < R)) then return 1 else return 0 end else return 0 end end end function GetDistance(e,v) if g_Entity[e] ~= nil and g_Entity[e] ~= 0 and g_Entity[v] ~= nil and g_Entity[v] ~= 0 then local disx = g_Entity[e]['x'] - g_Entity[v]['x'] local disz = g_Entity[e]['z'] - g_Entity[v]['z'] local disy = g_Entity[e]['y'] - g_Entity[v]['y'] return math.sqrt(disx^2 + disz^2 + disy^2) end end