--================================================================================================--
--=====  CLASSES  ================================================================================--
--================================================================================================--

---@alias RaycastShapeHandling
---| "COLLIDER" #The shape entities collide with
---| "OUTLINE" #The block outline when looked at
---| "VISUAL" #What Minecraft believes is the sight-blocking shape

---@alias RaycastFluidHandling
---| "NONE" #Do not raycast fluids
---| "SOURCE_ONLY" #Only raycast fluid sources
---| "ANY" #Raycast any fluid

---A predicate that tests for a block.
---
---Return `true` to stop raycasting and return the current block.  
---Return `false` to continue and ignore the current block.
---@alias BlockPredicate fun(block: BlockState, pos: VectorPos): boolean

---A predicate that tests for an entity.
---
---Return `true` to stop raycasting and return the current entity.  
---Return `false` to continue and ignore the current entity.
---@alias EntityPredicate fun(entity: Entity|LivingEntity|Player): boolean

--================================================================================================--
--=====  FUNCTIONS  ==============================================================================--
--================================================================================================--

---Contains generic functions related to rendering. Also contains some raycasting.
renderer = {}

---Returns the camera position of the player executing the script.
---@return VectorPos
function renderer.getCameraPos() end

---Returns the camera rotation.
---@return VectorAng
function renderer.getCameraRot() end

---Returns if fire can be rendered on the avatar.  
---Returns `nil` if it has not been set by `.setRenderFire()`.
---@return boolean?
function renderer.getRenderFire() end

---Returns if your player head shows your Figura HEAD/SKULL (true) or your vanilla head (false).
---@return boolean
function renderer.getRenderPlayerHead() end

---Returns the radius of the player's shadow.  
---Returns `nil` if the size has not been set by `.setShadowSize()`.
---@return number?
function renderer.getShadowSize() end

---Returns the length in pixels of a string or Raw JSON Text.
---@param text string
---@return integer
function renderer.getTextWidth(text) end

---Returns if the camera is in front of or behind the player.
---@return boolean
function renderer.isCameraBackwards() end

---Returns if the model is being viewed in first-person.  
---This will always return false for other clients since they cannot see your first-person model.
---@return boolean
function renderer.isFirstPerson() end

---Returns if your mount is enabled.
---@return boolean
function renderer.isMountEnabled() end

---Returns if your mount's shadow is enabled.
---@return boolean
function renderer.isMountShadowEnabled() end

---Casts a ray from startPos to endPos, looking at the blocks on the way.  
---If the ray never hits anything, then the function returns nil.
---@param startPos VectorPos
---@param endPos VectorPos
---@param shapeHandling RaycastShapeHandling
---@param fluidHandling RaycastFluidHandling
---@param predicate? BlockPredicate
---@return {state: BlockState, pos: VectorPos}?
function renderer.raycastBlocks(startPos, endPos, shapeHandling, fluidHandling, predicate) end

---Casts a ray from startPos to endPos, returning the first entity it sees on the way.  
---If the ray never hits anything, then the function returns nil.
---@param startPos VectorPos
---@param endPos VectorPos
---@param predicate? EntityPredicate
---@return {entity:Entity|LivingEntity|Player, pos:VectorPos}?
function renderer.raycastEntities(startPos, endPos, predicate) end

---Toggle the render of the entity you are riding.
---@param enabled boolean
function renderer.setMountEnabled(enabled) end

---Toggle the shadow of the entity you are riding.
---@param enabled boolean
function renderer.setMountShadowEnabled(enabled) end

---Toggle the rendering of fire on your avatar.  
---Set to `nil` to reset to default.
---@param enabled? boolean
function renderer.setRenderFire(enabled) end

---Toggle whether your playerhead renders your avatar's HEAD/SKULL or your vanilla skin.
---@param enabled boolean
function renderer.setRenderPlayerHead(enabled) end

---Sets the radius of the player's shadow.  
---Set the radius to `nil` to reset the shadow.
---@param radius number?
function renderer.setShadowSize(radius) end

---Shows the animation of you swinging your arm.  
---Set `offhand` to swing the offhand arm instead.
---
---Note: This is automatically synced to other players.
---@param offhand? boolean
function renderer.swingArm(offhand) end