77 lines
2.8 KiB
Lua
77 lines
2.8 KiB
Lua
|
local pi, sin, cos, abs = math.pi, math.sin, math.cos, math.abs
|
||
|
local function RotationToDirection(rotation)
|
||
|
local piDivBy180 = pi / 180
|
||
|
local adjustedRotation = vector3(
|
||
|
piDivBy180 * rotation.x,
|
||
|
piDivBy180 * rotation.y,
|
||
|
piDivBy180 * rotation.z
|
||
|
)
|
||
|
local direction = vector3(
|
||
|
-sin(adjustedRotation.z) * abs(cos(adjustedRotation.x)),
|
||
|
cos(adjustedRotation.z) * abs(cos(adjustedRotation.x)),
|
||
|
sin(adjustedRotation.x)
|
||
|
)
|
||
|
return direction
|
||
|
end
|
||
|
|
||
|
function RayCastGamePlayCamera(distance)
|
||
|
local cameraRotation = GetGameplayCamRot()
|
||
|
local cameraCoord = GetGameplayCamCoord()
|
||
|
--local right, direction, up, pos = GetCamMatrix(GetRenderingCam())
|
||
|
--local cameraCoord = pos
|
||
|
local direction = RotationToDirection(cameraRotation)
|
||
|
local destination = vector3(
|
||
|
cameraCoord.x + direction.x * distance,
|
||
|
cameraCoord.y + direction.y * distance,
|
||
|
cameraCoord.z + direction.z * distance
|
||
|
)
|
||
|
local ray = StartShapeTestRay(cameraCoord.x, cameraCoord.y, cameraCoord.z,
|
||
|
destination.x, destination.y, destination.z, 1, -1, 0)
|
||
|
local rayHandle, hit, endCoords, surfaceNormal, entityHit = GetShapeTestResult(ray)
|
||
|
return hit, endCoords, entityHit, surfaceNormal
|
||
|
end
|
||
|
|
||
|
-- GetUserInput function inspired by vMenu (https://github.com/TomGrobbe/vMenu/blob/master/vMenu/CommonFunctions.cs)
|
||
|
function GetUserInput(windowTitle, defaultText, maxInputLength)
|
||
|
blockinput = true
|
||
|
-- Create the window title string.
|
||
|
local resourceName = string.upper(GetCurrentResourceName())
|
||
|
local textEntry = resourceName .. "_WINDOW_TITLE"
|
||
|
if windowTitle == nil then
|
||
|
windowTitle = "Enter:"
|
||
|
end
|
||
|
AddTextEntry(textEntry, windowTitle)
|
||
|
|
||
|
-- Display the input box.
|
||
|
DisplayOnscreenKeyboard(1, textEntry, "", defaultText or "", "", "", "", maxInputLength or 30)
|
||
|
Wait(0)
|
||
|
-- Wait for a result.
|
||
|
while true do
|
||
|
local keyboardStatus = UpdateOnscreenKeyboard();
|
||
|
if keyboardStatus == 3 then -- not displaying input field anymore somehow
|
||
|
blockinput = false
|
||
|
return nil
|
||
|
elseif keyboardStatus == 2 then -- cancelled
|
||
|
blockinput = false
|
||
|
return nil
|
||
|
elseif keyboardStatus == 1 then -- finished editing
|
||
|
blockinput = false
|
||
|
return GetOnscreenKeyboardResult()
|
||
|
else
|
||
|
Wait(0)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function randomTargetSelectionInput()
|
||
|
local randomTargetSelection = GetUserInput("Should the laser randomly select it's next target point? (Y/n)", "", 1)
|
||
|
if randomTargetSelection == nil then return nil end
|
||
|
if randomTargetSelection == "" or string.lower(randomTargetSelection) == "y" then return true end
|
||
|
if string.lower(randomTargetSelection) == "n" then return false end
|
||
|
return randomTargetSelection
|
||
|
end
|
||
|
|
||
|
function DrawSphere(pos, radius, r, g, b, a)
|
||
|
DrawMarker(28, pos.x, pos.y, pos.z, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, radius, radius, radius, r, g, b, a, false, false, 2, nil, nil, false)
|
||
|
end
|