local screen = import 'getClientScreenValues'(); local respc = import 'respc'; local dxDrawImage = import 'dxDrawImage'; local dxDrawText = import 'dxDrawText'; local dxCreateFont = import 'dxCreateFont'; local lerp = import 'Lerp'; local _welcome; class 'Welcome' { constructor = function(self) self.visible = false self.animation = {alpha = 0} self.peds = {} self.pedsIndex = {} self.markers = {} self.markersIndex = {} self.objects = {} for i, v in pairs(config.peds) do local ped = createPed(v.skin, v.pos, v.rot) self.peds[i] = ped self.markers[i] = createMarker(v.pos, 'cylinder', 1.5, 0, 0, 0, 0) self.objects[i] = createObject(config.object.model, v.pos.x, v.pos.y, v.pos.z + 1.4, 0, 0, (v.rot + config.object.offset)) self.pedsIndex[ped] = i self.markersIndex[self.markers[i]] = i setElementFrozen(ped, true) setElementHealth(ped, 100) setElementCollisionsEnabled(ped, true) setPedCanBeKnockedOffBike(ped, false) setElementData(ped, "isWelcomePed", true, false) setMarkerColor(self.markers[i], 0, 0, 0, 0) setElementCollisionsEnabled(self.markers[i], false) addEventHandler("onClientMarkerHit", self.markers[i], function(hitPlayer) if hitPlayer == localPlayer then _welcome:show(i) end end) end engineImportTXD(engineLoadTXD('assets/models/text.txd'), config.object.model) engineReplaceModel(engineLoadDFF('assets/models/text.dff'), config.object.model) engineSetModelLODDistance(config.object.model, 15) end; show = function(self, index) if (self.visible) then return end self.visible = true self.index = index -- for i, v in ipairs(getElementsByType('player')) do -- setElementAlpha(v, 0) -- end local position = Vector3(getElementPosition(self.peds[self.index])) local rotation = Vector3(getElementRotation(self.peds[self.index])) local dx, dy = dirMove(rotation.z) dx, dy = position.x + dx * 2, position.y + dy * 2 rotateCamera(rotation.z + 180, 0.6, dx + 0.1, dy, position.z) if (self.animation.alpha <= 0.02) then addEventHandler('onClientRender', root, self.render, true, 'low+99') end addEventHandler('onClientClick', root, self.click) addEventHandler('onClientKey', root, self.key) showCursor(true) end; unshow = function(self) if (not self.visible) then return end self.visible = nil if (isElement(self.sound)) then stopSound(self.sound) end if (isTimer(self.stopAnim)) then killTimer(self.stopAnim) end setPedAnimation(self.peds[self.index]) -- for i, v in ipairs(getElementsByType('player')) do -- setElementAlpha(v, 255) -- end setCameraTarget(localPlayer) removeEventHandler('onClientClick', root, self.click) removeEventHandler('onClientKey', root, self.key) showCursor(false) end; render = function() local self = _welcome self.animation.alpha = lerp:create('alpha', 0, (self.visible and 1 or 0), 0.1) optionSelected = nil for i, v in ipairs(config.peds[self.index].options) do local hover = isCursorOnPosition((screen.x - respc(242 + 282)), (screen.y - respc(282)) / 2 - respc(8 - ((i - 1) * (8 + 48))), respc(282), respc(48)) local x = respc(242 + 282 + lerp:create('button_x_'..i, 0, (hover and 4 or 0), 0.1)) local y = respc(8 - ((i - 1) * (8 + 48)) + lerp:create('button_y_'..i, 0, (hover and 4 or 0), 0.1)) local w = respc(282 + lerp:create('button_w_'..i, 0, (hover and 8 or 0), 0.1)) local h = respc(48 + lerp:create('button_h_'..i, 0, (hover and 8 or 0), 0.1)) dxDrawImage((screen.x - x), (screen.y - respc(282)) / 2 - y, w, h, 'assets/images/button.png', 0, 0, 0, tocolor(255, 255, 255, 255 * self.animation.alpha)) dxDrawText(v.ask, (screen.x - x + respc(14)), (screen.y - respc(282)) / 2 - y, w, (h + 4), tocolor(217, 217, 217, 255 * self.animation.alpha), 1, dxCreateFont('assets/fonts/Poppins-Regular.ttf', 14), 'left', 'center') if (not optionSelected and hover) then optionSelected = i end end if (not self.visible and self.animation.alpha <= 0.02) then removeEventHandler('onClientRender', root, self.render, true, 'low+99') end end; click = function(b, s, absX, absY, worldX, worldY, worldZ, clickedElement) if (b ~= 'left' or s ~= 'down') then return end local self = _welcome if clickedElement then outputDebugString("Click detectado em: " .. tostring(getElementType(clickedElement))) end if (clickedElement and isElement(clickedElement) and self.pedsIndex[clickedElement]) then local index = self.pedsIndex[clickedElement] self:show(index) return end if (self.visible and optionSelected) then if (isElement(self.sound)) then stopSound(self.sound) end self.sound = playSound3D('assets/sounds/'..config.peds[self.index].options[optionSelected].sound, Vector3(getElementPosition(self.peds[self.index]))) if (isTimer(self.stopAnim)) then killTimer(self.stopAnim) end setPedAnimation(self.peds[self.index], config.peds[self.index].options[optionSelected].animation[1], config.peds[self.index].options[optionSelected].animation[2], -1, true, false, false) self.stopAnim = setTimer(function(ped) setPedAnimation(ped) end, (getSoundLength(self.sound) * 1000), 1, self.peds[self.index]) end end; key = function(b, s) if (s) then local self = _welcome if (b == 'escape' or b == 'backspace') then self:unshow() cancelEvent() end end end } -- // -- addEventHandler('onClientResourceStart', resourceRoot, function() _welcome = new 'Welcome'() dxCreateFont('assets/fonts/Poppins-Regular.ttf', 14) end) addEventHandler('onClientPedDamage', root, function() if (not _welcome or not _welcome.peds[source]) then return end cancelEvent() setElementHealth(source, 100) end) setTimer(function() if (not _welcome) then return end for i, ped in pairs(_welcome.peds) do if isElement(ped) then setElementHealth(ped, 100) setElementFrozen(ped, true) end end end, 1000, 0) setTimer(function() local self = _welcome if (self) then local pos = {getCameraMatrix(localPlayer)} if (pos[4] and pos[5] and pos[6]) then for i, v in pairs(self.objects) do local posO = {getElementPosition(v)} if (getDistanceBetweenPoints2D(pos[4], pos[5], posO[1], posO[2]) <= 40) then setElementRotation(v, 0, 0, findRotation(pos[4], pos[5], posO[1], posO[2])) end end end end end, 80, 0) function findRotation(x1, y1, x2, y2) local t = -math.deg(math.atan2(x2 - x1, y2 - y1)) return t < 0 and t + 360 or t end function dirMove(rot) if (rot > 180) then rot = 180 - (rot - 180) else rot = -rot end return math.sin(math.rad(rot)), math.cos(math.rad(rot)) end function rotateCamera(rot, rotz, x, y, z, fov) local dx, dy = dirMove(rot) ---] Ajustes principais na câmera: ---] Aumentei a altura da posição da câmera (z + 1.2) ---] Aumentei a altura do lookAt (z + 0.8 em vez de z + rotz) ---] Aumentei o FOV para 80 para ter uma visão mais ampla setCameraMatrix(x, y, z + 1.2, x + dx, y + dy, z + 0.9, 0, fov or 90) end