Jump to content

getWorldPositionFromMap


Recommended Posts

Olá amigos então eu estou com um problema que eu realmente não sou capaz de resolver !
Necessidade : Eu preciso pegar a posição do mundo através do cursor em cima da imagem do meu f11 personalizado

Descrição completa: Eu peguei esse roteiro de um amigo mais eu acredito já telo visto pela internet e eu estou fazendo varias modificações nele eu adicionei blips as bordas e outras correções ...
eu estou atualmente adicionando sistema de gps do gta v nele bom tudo já funciona porém eu coloquei para usar /gps aparece a imagem e eu clico no local porém eu quero fazer isso direto do mapa F11 eu tentei diversos cálculos mas o mais perto que eu cheguei foi obter a cordenada do mundo do centro em que o mapa esta

Nota: vou deixar o código do arquivado de render aqui ele tem outros roteiros necessários para funcionar se precisar do mesmo diga eu irei disponibilizar eu não tenho problema em telo disponível pela internet afinal apenas estou aprimorando para meu servidor mais ainda esta longe de completo.


Este é a função que eu fiz que me retorna a posição do mundo em que fica no centro do mapa quando eu movo ele vai pegando a cordenada do que esta no centro do render e seu eu movo o mouse ele apenas tem algumas alterações no floot da postion

No codigo estou testando isso na linha 256
 

function getWorldFromMapPosition(mapX, mapY, posx, posy, x, y, w, h, range)
	local worldX = posx + ((mapX - (x + w / 2)) / range) / 3000 / (range/180);
	local worldY = posy - ((mapY - (y + h / 2)) / range) / 3000 / (range/180);
	
	return worldX, worldY
end


 

Map = {}
Map.__index = Map
Map.instances = {}
Map.damageEfect = {}
local sx,sy = guiGetScreenSize()
px,py = 1366,768
x,y =  (sx/px), (sy/py)
font = dxCreateFont("images/myriadproregular.ttf",20,true)

local max,min = math.min,math.max
function cstrain( value, v1, v2 )
	return max(min(value,v1),v2)
end

function math.map(value, low1, high1, low2, high2)
	return low2 + (value - low1) * (high2 - low2) / (high1 - low1)
end

function Map.new(X,Y,W,H)
	local self = setmetatable({}, Map)
	self.x = X
	self.y = Y
	self.w = W
	self.h = H
	local pos = {getElementPosition(localPlayer)}
	self.posX = pos[1]
	self.posY = pos[2]
	self.posZ = pos[3]
	self.size = 90
	self.color = {255,255,255,255}	
	self.blipSize = x*18
	self.drawRange = 220
	self.map = dxCreateTexture("images/gtasa.png","dxt5")
	self.map2 = dxCreateTexture("images/gtasa2.png","dxt5")
	self.renderTarget = dxCreateRenderTarget(W, H, true)
	self.blips = {}
	for k=0, 63 do
		self.blips[k] = dxCreateTexture("images/icons/"..k..".png","dxt3")
	end
	if(#Map.instances == 0) then
		addEventHandler("onClientRender", getRootElement(), Map.render)
	end
	
	table.insert(Map.instances, self)
	return self	
end

function Map.render()
	for k,v in pairs(Map.instances) do
		if v.visible then
			if not v.style then
				v:draw()
			elseif v.style == 1 then
				v:draw2()
			end
		end
	end
end

function Map:setVisible(bool)
	self.visible = bool
	if bool == true then
		self:setPosition(getElementPosition(localPlayer))
	end
	return true
end

function Map:isVisible()
	return self.visible
end

function Map:setPosition(x,y,z)
	self.posX = x
	self.posY = y
	self.posZ = z
	return true
end

function Map:getPosition()
	return self.posX, self.posY, self.posZ
end

function Map:setColor(r,g,b,a)
	self.color = {r,g,b,a}
	return true
end

function Map:getColor()
	return self.color
end

function Map:setSize(value)
	self.size = value
	return true
end

function dxDrawEmptyRec(absX,absY,sizeX,sizeY,color,ancho)
    dxDrawRectangle ( absX,absY,sizeX,ancho,color )
	dxDrawRectangle ( absX,absY+ancho,ancho,sizeY-ancho,color )
	dxDrawRectangle ( absX+ancho,absY+sizeY-ancho,sizeX-ancho,ancho,color )
	dxDrawRectangle ( absX+sizeX-ancho,absY+ancho,ancho,sizeY-ancho*2,color )	
end

function Map:draw()
	dxSetRenderTarget(self.renderTarget, true)
		
	local player = getLocalPlayer()
	local centerX = (self.x) + (self.w/2)
	local centerY = (self.y) + (self.h/2)
	local pr = getPedRotation(player)
	local mapSize = 3000 / (self.drawRange/180)
	local zoomwert = self.drawRange 
	
	if getKeyState("=") then
		if self.drawRange > 120 then
			self.drawRange = self.drawRange - 8
		end
	elseif getKeyState("-") then
		if self.drawRange < 660 then
			self.drawRange = self.drawRange + 8
		end
	elseif getKeyState("arrow_l") then
			self.posX = self.posX - (self.drawRange/100*10)
	elseif getKeyState("arrow_r") then
			self.posX = self.posX + (self.drawRange/100*10)
	elseif getKeyState("arrow_u") then
			self.posY = self.posY + (self.drawRange/100*10)
	elseif getKeyState("arrow_d") then
			self.posY = self.posY - (self.drawRange/100*10)
	end
	
	local mapPosX, mapPosY = -(math.map(self.posX+3000,0,6000,0,mapSize)-self.w/2), -(math.map(-self.posY + 3000, 0, 6000, 0, mapSize)-self.h/2)
	
	
	--[[
	local screenW, screenH = guiGetScreenSize()
	local mptx,mpty,mptz = getWorldFromScreenPosition ( centerX, centerY, self.drawRange )
	dxDrawText(tostring(umgerechnetx1), screenW * 0.3713, screenH * 0.6276, screenW * 0.6272, screenH * 0.9154, tocolor(255, 255, 255, 255), 1.00, "default", "left", "top", false, false, false, false, false)
	--]]
	-----------------------------------------------------------------------------------------------------
	-- draw map
	
	dxDrawRectangle(0,0,self.w,self.h,tocolor(0,120,210))
	dxDrawImage(mapPosX, mapPosY, mapSize, mapSize, self.map, 0,0,0, tocolor(255,255,255))	
	
	
	
	
	
		-----------------------------------------------------------------------------------------------------
		-- draw radar areas
		
			for i, area in ipairs (getElementsByType("radararea")) do
				local ex, ey = getElementPosition(area)
				local w, h = getRadarAreaSize(area)
				local areaX = (3000+ex) / 6000 * mapSize
				local areaY = (3000-ey) / 6000 * mapSize
				local scaledW = w / 6000*mapSize
				local scaledH = -(h / 6000*mapSize)
				areaX = areaX + mapPosX
				areaY = areaY + mapPosY
				local rr, gg, bb, alpha = 255,255,255,255
				rr, gg, bb, alpha = getRadarAreaColor(area)

	            if (isRadarAreaFlashing(area)) then
	                alpha = alpha*math.abs(getTickCount()%1000-500)/500
	            end
				dxSetBlendMode("modulate_add")
				dxDrawRectangle(areaX, areaY, scaledW, scaledH,tocolor(rr,gg,bb,alpha))
				dxSetBlendMode("blend")
			end			
			
			
		--local minStreamPosX,maxStreamPosX,minStreamPosY,maxStreamPosY=playerX-300*px*zoomwert,playerX+300*px*zoomwert,playerY-300*py*zoomwert,playerY+300*py*zoomwert
		if (#wegTable > 0) then
			for i,wayPoint in ipairs(wegTable) do
				--if mapPosX<wegTable[i].posX and mapPosX >wegTable[i].posX and mapPosY<wegTable[i].posY and mapPosY>wegTable[i].posY then
					local ex,ey = wegTable[i].posX,wegTable[i].posY
					local blipX = (3000+ex) / 6000 * mapSize
					local blipY = (3000-ey) / 6000 * mapSize
					blipX = blipX + mapPosX
					blipY = blipY + mapPosY
					if wegTable[i+1] then
						local ex2,ey2 = wegTable[i+1].posX,wegTable[i+1].posY
						local blipX2 = (3000+ex2) / 6000 * mapSize
						local blipY2 = (3000-ey2) / 6000 * mapSize
						blipX2 = blipX2 + mapPosX
						blipY2 = blipY2 + mapPosY
						local umgerechnetx1, umgerechnety1 = blipX,blipY
						local umgerechnetx2, umgerechnety2 = blipX2,blipY2
						dxDrawLine(umgerechnetx1,umgerechnety1,umgerechnetx2,umgerechnety2,gpsColorRed, zoomwert / 10 / 20)
					else
						local ex2,ey2 = lastMarkerPositionX,lastMarkerPositionY
						local blipX2 = (3000+ex2) / 6000 * mapSize
						local blipY2 = (3000-ey2) / 6000 * mapSize
						blipX2 = blipX2 + mapPosX
						blipY2 = blipY2 + mapPosY
						local umgerechnetx1, umgerechnety1 = blipX,blipY
						local umgerechnetx2, umgerechnety2 = blipX2,blipY2
						dxDrawLine(umgerechnetx1,umgerechnety1,umgerechnetx2,umgerechnety2,gpsColorRed, zoomwert / 10 / 20)
					end
				--end
			end
		end


		--[[function getWorldFromMapPosition(mapX, mapY)
			self.posX, self.posY, self.posZ = getElementPosition(player)
			local mapX, mapY = getCursorPosition()
			local worldX = ((mapX - (self.posX + self.w / 2)) / self.drawRange) / 3000 / (self.drawRange/180);
			local worldY = ((mapY - (self.posY + self.h / 2)) / self.drawRange) / 3000 / (self.drawRange/180);
			
			outputChatBox(tostring(worldX).." | "..tostring(worldY))
			--return worldX, worldY;
		--end--]]
			

	-----------------------------------------------------------------------------------------------------
	-- draw arrow local
		
	local b = self.blipSize
	local ex,ey = getElementPosition(player)
	local blipX = (3000+ex) / 6000 * mapSize
	local blipY = (3000-ey) / 6000 * mapSize
	blipX = blipX + mapPosX
	blipY = blipY + mapPosY
	
	dxDrawImage(blipX-x*23/2, blipY-y*25/2,x*23,y*25, self.blips[2], (-pr)%360,0,0,tocolor(255,255,255,255))	
	dxSetRenderTarget()	
	
	
	
	
	-----------------------------------------------------------------------------------------------------
	-- draw render target
	
	dxDrawEmptyRec(self.x-x*5, self.y-y*5, self.w+x*10, self.h+y*10,tocolor(0,0,0,150),5)
	dxDrawImage(self.x, self.y, self.w, self.h, self.renderTarget,0,0,0,tocolor(unpack(self.color)))	
	
	
	
	
		-----------------------------------------------------------------------------------------------------
		-- draw blips
		
		for i, b in ipairs (getElementsByType('blip')) do
		if getElementDimension(b) == getElementDimension(player) and getElementInterior(b) == getElementInterior(player) then
			local elementAttached =  getElementAttachedTo ( b )
			if elementAttached ~= player then
				local ex, ey, ez = getElementPosition(b)				
				local blipX = (3000+ex) / 6000 * mapSize
				local blipY = (3000-ey) / 6000 * mapSize
				blipX = blipX + mapPosX + self.x
				blipY = blipY + mapPosY + self.y

				--[[if isCursorShowing(localPlayer) then
					local mapX, mapY = getCursorPosition()
					local tx,ty = getWorldFromMapPosition(mapX, mapY, self.posX, self.posY, self.x, self.y, self.w, self.h, self.drawRange)
					outputChatBox(tostring(tx).." | "..tostring(ty))
				end--]]
				
				if blipX < self.x then blipX = self.x end
				if blipX > self.x + self.w then blipX = self.x + self.w end
				if blipY < self.y then blipY = self.y end
				if blipY > self.y + self.h then blipY = self.y + self.h end
				
				local blipIcon = getBlipIcon(b)
				local rr,gg,bb,aa = 255,255,255,255
				local blipSize = self.blipSize

				if (elementAttached) and (getElementType(elementAttached) == "vehicle") then
					blipSize = blipSize / 2
					aa = 200
				end
				local blipIcon = getBlipIcon(b)
				if blipIcon == 0 then
					rr, gg, bb, aa = getBlipColor(b)
				end
				local img = self.blips[blipIcon]
				if (elementAttached) and (getElementType(elementAttached) == "player") then
					img = self.blips[0]
					blipSize = blipSize / 1.6
				end
				dxDrawImage(blipX-blipSize/2, blipY-blipSize/2, blipSize, blipSize, img,0,0,0,tocolor(rr,gg,bb,aa))
			end
		end
	end
end

wegTable={}

function Map:draw2()
	dxSetRenderTarget(self.renderTarget, true)
		
	local player = getLocalPlayer()
	local centerX = (self.x) + (self.w/2)
	local centerY = (self.y) + (self.h/2)
	local pr = getPedRotation(player)
	local mapSize = 3000 / (self.drawRange/180)
	local zoomwert = self.drawRange
	local _, _, camRotZ = getElementRotation(getCamera())
	
	if getKeyState("=") then
		if self.drawRange > 120 then
			self.drawRange = self.drawRange - 8
		end
	elseif getKeyState("-") then
		if self.drawRange < 260 then
			self.drawRange = self.drawRange + 8
		end
	end
		self.posX, self.posY, self.posZ = getElementPosition(player)
		local playerX, playerY, playerZ = getElementPosition(player)
		
		local mapPosX, mapPosY = -(math.map(self.posX+3000,0,6000,0,mapSize)-self.w/2), -(math.map(-self.posY + 3000, 0, 6000, 0, mapSize)-self.h/2)
		
		
		
		
	    -----------------------------------------------------------------------------------------------------
		-- draw map
		
		local cx,cy,_,tx,ty = getCameraMatrix()
		local north = findRotation(cx,cy,tx,ty)
		dxDrawRectangle(0,0,self.w,self.h,tocolor(0,120,210))
		dxDrawImage(mapPosX, mapPosY, mapSize, mapSize, self.map2, north, -mapSize/2 - mapPosX +  self.w/2, -mapSize/2 - mapPosY + self.h/2, tocolor(255,255,255))
		
		-----------------------------------------------------------------------------------------------------
		-- draw wanted level effect
		
			if getPlayerWantedLevel(player) > 0 then
				if not old then
					old = getTickCount()
					wR,wG,wB = 0,0,255
				end 
				current = getTickCount ()
				if current-old > 1500 then
					old = getTickCount()
					if wR == 255 then
						wR,wG,wB = 0,100,255
					else
						wR,wG,wB = 255,0,0
					end
				end
				dxDrawRectangle(0, 0, self.w, self.h,tocolor(wR,wG,wB,100))
			end
		
		
		
		    -----------------------------------------------------------------------------------------------------
		    -- draw radar areas
				
				for i, area in ipairs (getElementsByType("radararea")) do
					local ex, ey = getElementPosition(area)
					local w, h = getRadarAreaSize(area)
					local areaX = (3000+ex) / 6000 * mapSize
					local areaY = (3000-ey) / 6000 * mapSize
					local scaledW = w / 6000*mapSize
					local scaledH = -(h / 6000*mapSize)
					areaX = areaX + mapPosX
					areaY = areaY + mapPosY
					local rr, gg, bb, alpha = 255,255,255,255
					rr, gg, bb, alpha = getRadarAreaColor(area)

					if (isRadarAreaFlashing(area)) then
						alpha = alpha*math.abs(getTickCount()%1000-500)/500
					end
					dxSetBlendMode("modulate_add")
					dxDrawImage(areaX, areaY, scaledW, scaledH,self.blips[1], north, -scaledW/2 - areaX +  self.w/2, -scaledH/2 - areaY + self.h/2,tocolor(rr,gg,bb,alpha))
					dxSetBlendMode("blend")
				end
				
				
				
				
				
		 -----------------------------------------------------------------------------------------------------
		 -- draw blips
		 
			for i, b in ipairs (getElementsByType('blip')) do
			if getElementDimension(b) == getElementDimension(player) and getElementInterior(b) == getElementInterior(player) then
				local elementAttached =  getElementAttachedTo ( b )
				if elementAttached ~= player then
					local ex, ey, ez = getElementPosition(b)
					local bf = getBlipVisibleDistance(b)
					local blipIcon = getBlipIcon(b)
					local rr,gg,bb,aa = 255,255,255,255
					local blipSize = self.blipSize
					
					local blipX, blipY = getRadarFromWorldPosition(ex,ey,-x*40, -y*40, self.w+x*80, self.h+y*80,mapSize)

					local Px, Py, Pz = getElementPosition(player)
					if getDistanceBetweenPoints2D(Px, Py, ex, ey) < 380 then
						--outputChatBox(getDistanceBetweenPoints2D(Px, Py, ex, ey)..' : '..bf)
						blipX, blipY = cstrain(blipX, 1, 258), cstrain(blipY, 1, 150)
					end

		
					if (elementAttached) and (getElementType(elementAttached) == "vehicle") then
						blipSize = blipSize / 2
						aa = 200
					end
					local blipIcon = getBlipIcon(b)
					if blipIcon == 0 then
						rr, gg, bb, aa = getBlipColor(b)
					end
					local img = self.blips[blipIcon]
					if (elementAttached) and (getElementType(elementAttached) == "player") then
						img = self.blips[0]
						blipSize = blipSize / 1.6
					end
					dxDrawImage(blipX-blipSize/2, blipY-blipSize/2, blipSize, blipSize,img, 0,0,0,tocolor(rr,gg,bb,aa))
					
				if (elementAttached) and (getElementType(elementAttached) == "player") and getPedOccupiedVehicle(elementAttached) and getVehicleType(getPedOccupiedVehicle(elementAttached)) == "Helicopter" then	
					dxDrawImage(blipX-x*50/2, blipY-y*50/2, x*50, y*50, "images/H.png",north-getPedRotation(elementAttached))
					dxDrawImage(blipX-x*50/2, blipY-y*50/2, x*50, y*50, "images/HR.png",getTickCount()%360)
				end
				end
			end
		end
		
		
		--local minStreamPosX,maxStreamPosX,minStreamPosY,maxStreamPosY=playerX-300*px*zoomwert,playerX+300*px*zoomwert,playerY-300*py*zoomwert,playerY+300*py*zoomwert
		if (#wegTable > 0) then
			for i,wayPoint in ipairs(wegTable) do
				--if mapPosX<wegTable[i].posX and mapPosX >wegTable[i].posX and mapPosY<wegTable[i].posY and mapPosY>wegTable[i].posY then
					local screenW, screenH = guiGetScreenSize()
					if wegTable[i+1] then
						local umgerechnetx1, umgerechnety1 = getRadarFromWorldPosition(wegTable[i].posX,wegTable[i].posY,-x*40, -y*40, self.w+x*80, self.h+y*80,mapSize)
						local umgerechnetx2, umgerechnety2 = getRadarFromWorldPosition(wegTable[i+1].posX,wegTable[i+1].posY,-x*40, -y*40, self.w+x*80, self.h+y*80,mapSize)
						dxDrawLine(umgerechnetx1,umgerechnety1,umgerechnetx2,umgerechnety2,gpsColorRed, zoomwert / 6 / 10)
					else
						local umgerechnetx1, umgerechnety1 = getRadarFromWorldPosition(wegTable[i].posX,wegTable[i].posY,-x*40, -y*40, self.w+x*80, self.h+y*80,mapSize)
						local umgerechnetx2, umgerechnety2 = getRadarFromWorldPosition(lastMarkerPositionX,lastMarkerPositionY,-x*40, -y*40, self.w+x*80, self.h+y*80,mapSize)
						dxDrawLine(umgerechnetx1,umgerechnety1,umgerechnetx2,umgerechnety2,gpsColorRed, zoomwert / 6 / 10)
					end
				--end
			end
		end
		
		-----------------------------------------------------------------------------------------------------
		-- draw arrow local
		
		local b = self.blipSize
		local ex,ey = getElementPosition(player)
		local blipX = (3000+ex) / 6000 * mapSize
		local blipY = (3000-ey) / 6000 * mapSize
		blipX = blipX + mapPosX
		blipY = blipY + mapPosY
		
		if getPedOccupiedVehicle(player) and getVehicleType(getPedOccupiedVehicle(player)) == "Helicopter" then
			dxDrawImage(blipX-x*50/2, blipY-y*50/2, x*50, y*50, "images/H.png",north-pr)
			dxDrawImage(blipX-x*50/2, blipY-y*50/2, x*50, y*50, "images/HR.png",getTickCount()%360)
		else
			dxDrawImage(blipX-x*23/2, blipY-y*25/2,x*23,y*25, self.blips[2], north-pr,0,0,tocolor(255,255,255,255))	
		end
			
	dxSetRenderTarget()	
	
	
	
	
	
	-----------------------------------------------------------------------------------------------------
	-- draw render target
	
	if getElementInterior(player) == 0 then
		dxDrawRectangle(self.x-x*5, self.y-y*5, self.w+x*10, self.h+y*10, tocolor(0, 0, 0, 150), false)
		dxDrawImage(self.x, self.y, self.w, self.h, self.renderTarget,0,0,0,tocolor(unpack(self.color)))
	else
		dxDrawImage(self.x, self.y, self.w, self.h, "images/lostc.png")
	end
	
	
	
	
	
    -----------------------------------------------------------------------------------------------------
	-- draw damage effect
	
	for k, v in ipairs(Map.damageEfect) do
		v[3] = v[3] - (getTickCount() - v[1]) / 800 
		if v[3] <= 0 then
			table.remove(Map.damageEfect, k)
		else
			dxDrawImage(self.x, self.y, self.w, self.h, "images/mapred.png", 0, 0, 0, tocolor(255, 255, 255, v[3]))
		end		
	end
	
	--dxDrawImage(self.x-x*5, self.y-y*22, self.w+x*10, self.h+y*28, "images/mapbg.png",0,0,0,tocolor(unpack(self.color)))	
	--local zinColor = getKeyState("=") and tocolor(255,255,255,self.color[4]) or tocolor(172,211,115,self.color[4])
	--dxDrawImage(self.x+x*263, self.y-y*19,x*17,y*17, "images/zin.png",0,0,0,zinColor)
	--local zoutColor = getKeyState("-") and tocolor(255,255,255,self.color[4]) or tocolor(172,211,115,self.color[4])
	--dxDrawImage(self.x+x*285, self.y-y*19,x*17,y*17, "images/zout.png",0,0,0,zoutColor)
	--dxDrawText(zoneText,self.x+x*32,self.y-y*22, x*100, y*100, tocolor(unpack(self.color)), x*0.6, font,"left","top",false,false,false,true)
	--dxDrawRectangle(self.x-x*5, self.y-y*5, self.w+x*10, self.h+y*10, tocolor(0, 0, 0, 150), false)
	local zoneText = getElementInterior(player) == 0 and "#FFFFFF"..getZoneName(playerX,playerY,playerZ) or "#FFFFFF"
	dxDrawRectangle(self.x, self.y+self.h-y*20, self.w, self.h/8, tocolor(0, 0, 0, 80), false)
	dxDrawText("   "..zoneText,self.x, self.y+self.h-y*21, x*100, y*100, tocolor(255, 255, 255, 255), x*0.6, font,"left","top",false,false,false,true)
end

function findRotation(x1, y1, x2, y2)
  local t = -math.deg(math.atan2(x2-x1,y2-y1))
  if t < 0 then t = t + 360 end
  return t
end

function getPointAway(x, y, angle, dist)
        local a = -math.rad(angle)
        dist = dist / 57.295779513082
        return x + (dist * math.deg(math.sin(a))), y + (dist * math.deg(math.cos(a)))
end
 
function getRadarFromWorldPosition(bx, by, x, y, w, h, scaledMapSize)
	local RadarX, RadarY = x + w/2, y + h/2
	local RadarD = getDistanceBetweenPoints2D(RadarX, RadarY, x, y)
	local px, py = getElementPosition(localPlayer)
	local _, _, crz = getElementRotation(getCamera())
	local dist = getDistanceBetweenPoints2D(px, py, bx, by)
	if dist > RadarD * 6000/scaledMapSize then
		dist = RadarD * 6000/scaledMapSize
	end
	local rot = 180 - findRotation(px, py, bx, by) + crz
	local ax, ay = getPointAway(RadarX, RadarY, rot, dist * scaledMapSize/6000)
	return ax, ay
end

function onClientPlayerDamage(attacker, weapon, _, bodypart)
	local part = attacker and getElementType(attacker) == "player" and getPedWeaponSlot(attacker) and getPedWeaponSlot(attacker) or false	
	if attacker and attacker ~= source and not (part == 8 or (part == 7 and weapon ~= 38)) then
		Map.damageEfect[#Map.damageEfect + 1] = {getTickCount(), 0, math.min(25.5 * bodypart, 255)}
	else
		Map.damageEfect[#Map.damageEfect + 1] = {getTickCount(), 0, math.min(20 * bodypart, 255)}
	end
	if #Map.damageEfect > 18 then
		repeat
			table.remove(Map.damageEfect, 1)
		until #Map.damageEfect < 18
	end
end
addEventHandler("onClientPlayerDamage", localPlayer,onClientPlayerDamage)


function getWorldFromMapPosition(mapX, mapY, posx, posy, x, y, w, h, range)
	local worldX = posx + ((mapX*10 - (x + w / 2)) / range) / 3000 / (range/180);
	local worldY = posy - ((mapY*10 - (y + h / 2)) / range) / 3000 / (range/180);
	
	return worldX, worldY
end


 

Edited by raynner
Link to comment

se eu entendi direito vc precisa as coordenadas do mapa f11 atraves de click ou algo assim?
tem essa funcao getPlayerMapBoundingBox que talvez ajude, peguei esse exemplo da wiki,
 

local screenSize = Vector2(guiGetScreenSize())

local function handleMapTargetBlip()

    if not isPlayerMapVisible() then
        showCursor(false, false)
        wasLeftMouseButtonPressed, wasRightMouseButtonPressed = false, false
        return
    end

    if not isCursorShowing() then
        showCursor(true, false)
    end

    local isLeftMouseButtonPressed = getKeyState("mouse1")
    if isLeftMouseButtonPressed and isLeftMouseButtonPressed ~= wasLeftMouseButtonPressed then

        local cursorPos, mapMin, mapMax = Vector2(getCursorPosition())

        cursorPos.x, cursorPos.y = cursorPos.x * screenSize.x, cursorPos.y * screenSize.y

        do
            local mx, my, Mx, My = getPlayerMapBoundingBox()
            mapMin = Vector2(mx, my)
            mapMax = Vector2(Mx, My)
        end

        if cursorPos.x >= mapMin.x and cursorPos.y >= mapMin.y and cursorPos.x <= mapMax.x and cursorPos.y <= mapMax.y then

            local relPos = Vector2((cursorPos.x - mapMin.x) / (mapMax.x - mapMin.x), (cursorPos.y - mapMin.y) / (mapMax.y - mapMin.y))


            local worldPlanePos = Vector2(6000 * (relPos.x - 0.5), 3000 - (relPos.y * 6000))

            local worldPos = Vector3(worldPlanePos.x, worldPlanePos.y, getGroundPosition(worldPlanePos.x, worldPlanePos.y, 3000))

            outputChatBox("x: "..worldPlanePos.x.." y: "..worldPlanePos.y.." z: "..getGroundPosition(worldPlanePos.x, worldPlanePos.y, 3000))

        end
    end


end
addEventHandler("onClientRender", root, handleMapTargetBlip)

e editei uma linha pra que saia as coords no chat quando clica no mapa do f11, mesmo que seu mapa seja diferente do padrao do mta vc pode aproveitar o algoritmo, as coords Z precisa estar perto do player pro getgroundposition funcionar, ou precisa teleportar antes o player pra perto pra carregar os dados de coll e ai sim achar a position Z do chao
 

  • Thanks 1
Link to comment
30 minutes ago, _Ace said:

se eu entendi direito vc precisa as coordenadas do mapa f11 atraves de click ou algo assim?
tem essa funcao getPlayerMapBoundingBox que talvez ajude, peguei esse exemplo da wiki,
 


local screenSize = Vector2(guiGetScreenSize())local function handleMapTargetBlip()    if not isPlayerMapVisible() then        showCursor(false, false)        wasLeftMouseButtonPressed, wasRightMouseButtonPressed = false, false        return    end    if not isCursorShowing() then        showCursor(true, false)    end    local isLeftMouseButtonPressed = getKeyState("mouse1")    if isLeftMouseButtonPressed and isLeftMouseButtonPressed ~= wasLeftMouseButtonPressed then        local cursorPos, mapMin, mapMax = Vector2(getCursorPosition())        cursorPos.x, cursorPos.y = cursorPos.x * screenSize.x, cursorPos.y * screenSize.y        do            local mx, my, Mx, My = getPlayerMapBoundingBox()            mapMin = Vector2(mx, my)            mapMax = Vector2(Mx, My)        end        if cursorPos.x >= mapMin.x and cursorPos.y >= mapMin.y and cursorPos.x <= mapMax.x and cursorPos.y <= mapMax.y then            local relPos = Vector2((cursorPos.x - mapMin.x) / (mapMax.x - mapMin.x), (cursorPos.y - mapMin.y) / (mapMax.y - mapMin.y))            local worldPlanePos = Vector2(6000 * (relPos.x - 0.5), 3000 - (relPos.y * 6000))            local worldPos = Vector3(worldPlanePos.x, worldPlanePos.y, getGroundPosition(worldPlanePos.x, worldPlanePos.y, 3000))            outputChatBox("x: "..worldPlanePos.x.." y: "..worldPlanePos.y.." z: "..getGroundPosition(worldPlanePos.x, worldPlanePos.y, 3000))        end    endendaddEventHandler("onClientRender", root, handleMapTargetBlip)

e editei uma linha pra que saia as coords no chat quando clica no mapa do f11, mesmo que seu mapa seja diferente do padrao do mta vc pode aproveitar o algoritmo, as coords Z precisa estar perto do player pro getgroundposition funcionar, ou precisa teleportar antes o player pra perto pra carregar os dados de coll e ai sim achar a position Z do chao
 

Bom isto n funciona pois meu mapa F11 não é modificado e sim um script que cria um novo F11 e ele oculta o original não substitui a imagem original !

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...