Jump to content

getWorldFromMapPosition


raynner

Recommended Posts

Hello first sorry for the english

I have a script that I'm editing
it creates a radar: minimap and a bigmap (f11) (note: it does not replace the original it creates a new one and hides the original)

I added gta v gps to it and everything works correctly but to create the route I type a command / gps and it renders me an image where I click and the script gets the coordinate and creates a route!

what I want is to get the coordinate by clicking on the bigmap!

I tried however the most I got was to create a function that returns the value x, y, z of the world that is being rendered in the center of the map and if I move the cursor I only have changes in the floot

the function that I created
 

--[[
mapX = CursorX
mapY = CursorY
PosX = playerX
PosY = playerY
x = bigmap render x
y = bigmap render y
w = bigmap render w
h = bigmap render h
range = zoom
--]]
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

my main code
I don't see the need to show others more if you need to let me know
I'm testing this on line 256
 

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 getDistanceBetweenPoints2D(Px, Py, ex, ey) < bf then
						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
				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

 

Link to comment

Dear raynner,

since I have no map image to test with, no mathematical model of your map rendering other than the code I am just gonna assume some things.

1) your map starts from world coordinate x=-3000,y=-3000 (bottom-left) to x=3000,y=3000 (top-right).
2) mapX, mapY are relative coordinates into the map starting from top-left; posx, posy, x, y, w, h describe absolute coordinates

Thus your function should look like this:

--[[
mapX = CursorX
mapY = CursorY
PosX = playerX
PosY = playerY
x = bigmap render x
y = bigmap render y
w = bigmap render w
h = bigmap render h
range = zoom
--]]
local screenW, screenH = guiGetScreenSize()

function getWorldFromMapPosition(mapX, mapY, posx, posy, x, y, w, h, range)
  local zoomFactor = ( 180 / range );
  local render_side_distance = 3000 * zoomFactor;
  
  local world_tl_start_x = ( posx - render_side_distance );
  local world_tl_start_y = ( posy + render_side_distance );
  
  local absCursorX = ( mapX * screenW );
  local absCursorY = ( mapY * screenH );
  
  local real_map_off_x = ( absCursorX - x );
  local real_map_off_y = ( absCursorY - y );
  
  -- Cursor outside of the map image?
  if ( real_map_off_x < 0 ) or ( real_map_off_x >= w ) or ( real_map_off_y < 0 ) or ( real_map_off_y >= h ) then
    return false;
  end
  
  local relative_map_off_x = ( real_map_off_x / w );
  local relative_map_off_y = ( real_map_off_y / h );
  
  local worldX = world_tl_start_x + relative_map_off_x * render_side_distance;
  local worldY = world_tl_start_y - relative_map_off_y * render_side_distance;
  
  return worldX, worldY;
end

If this function above should not work (I am unable to test without a working resource!), please do not shy away from providing a working resource if you want us to help you further. :) 

Edited by The_GTA
Link to comment
33 minutes ago, The_GTA said:

Dear raynner,

since I have no map image to test with, no mathematical model of your map rendering other than the code I am just gonna assume some things.

1) your map starts from world coordinate x=-3000,y=-3000 (bottom-left) to x=3000,y=3000 (top-right).
2) mapX, mapY are relative coordinates into the map starting from top-left; posx, posy, x, y, w, h describe absolute coordinates

Thus your function should look like this:


--[[mapX = CursorXmapY = CursorYPosX = playerXPosY = playerYx = bigmap render xy = bigmap render yw = bigmap render wh = bigmap render hrange = zoom--]]local screenW, screenH = guiGetScreenSize()function getWorldFromMapPosition(mapX, mapY, posx, posy, x, y, w, h, range)  local zoomFactor = ( 180 / range );  local render_side_distance = 3000 * zoomFactor;    local world_tl_start_x = ( posx - render_side_distance );  local world_tl_start_y = ( posy + render_side_distance );    local absCursorX = ( mapX * screenW );  local absCursorY = ( mapY * screenH );    local real_map_off_x = ( absCursorX - x );  local real_map_off_y = ( absCursorY - y );    -- Cursor outside of the map image?  if ( real_map_off_x < 0 ) or ( real_map_off_x >= w ) or ( real_map_off_y < 0 ) or ( real_map_off_y >= h ) then    return false;  end    local relative_map_off_x = ( real_map_off_x / w );  local relative_map_off_y = ( real_map_off_y / h );    local worldX = world_tl_start_x + relative_map_off_x * render_side_distance;  local worldY = world_tl_start_y - relative_map_off_y * render_side_distance;    return worldX, worldY;end

If this function above should not work (I am unable to test without a working resource!), please do not shy away from providing a working resource if you want us to help you further. :) 

this seems to work but is not correct!
it does not return the correct coordinates

I will leave this feature on my drive so that anyone can test it I thought first to leave it in the community more like this incomplete would not be fair

radar Drive

Link to comment

Thank you for sharing your resource with us. I admit that I had to get my head around that zooming logic, because it is math that I was quite unfamiliar with, but here is your function:

local map_world_units_width = 6000;
function getWorldFromMapPosition(mapX, mapY, posx, posy, x, y, w, h, range)
  local zoomFactor = ( 180 / range );

  local render_pixel_side_distance = 3000 * zoomFactor; -- actual size of the map in pixels inside the render-target.
  local world_render_distance_w = w / render_pixel_side_distance * map_world_units_width;
  local world_render_distance_h = h / render_pixel_side_distance * map_world_units_width;
  
  local world_tl_start_x = ( posx - world_render_distance_w / 2 );
  local world_tl_start_y = ( posy + world_render_distance_h / 2 );
  
  local absCursorX = ( mapX * sx );
  local absCursorY = ( mapY * sy );
  
  local real_map_off_x = ( absCursorX - x );
  local real_map_off_y = ( absCursorY - y );
  
  -- Cursor outside of the map image?
  if ( real_map_off_x < 0 ) or ( real_map_off_x >= w ) or ( real_map_off_y < 0 ) or ( real_map_off_y >= h ) then
    return false;
  end
  
  local relative_map_off_x = ( real_map_off_x / w );
  local relative_map_off_y = ( real_map_off_y / h );
  
  local worldX = world_tl_start_x + relative_map_off_x * world_render_distance_w;
  local worldY = world_tl_start_y - relative_map_off_y * world_render_distance_h;
  
  return worldX, worldY;
end

The clue was to calculate the size of the map that you draw inside the render target, then calculate the fraction of the width and height of how much you draw of the actual map image. So if you draw only a third of the map image, then you can expect the render to cover about 2000 game units. Then we can just linearly interpolate the world position with the relative cursor position on the map render. I noticed that your map does not render using same width and height thus I added further adjustments.

Have fun with the code! :) 

Edited by The_GTA
  • Thanks 1
Link to comment
2 hours ago, The_GTA said:

Thank you for sharing your resource with us. I admit that I had to get my head around that zooming logic, because it is math that I was quite unfamiliar with, but here is your function:


local map_world_units_width = 6000;function getWorldFromMapPosition(mapX, mapY, posx, posy, x, y, w, h, range)  local zoomFactor = ( 180 / range );  local render_pixel_side_distance = 3000 * zoomFactor; -- actual size of the map in pixels inside the render-target.  local world_render_distance_w = w / render_pixel_side_distance * map_world_units_width;  local world_render_distance_h = h / render_pixel_side_distance * map_world_units_width;    local world_tl_start_x = ( posx - world_render_distance_w / 2 );  local world_tl_start_y = ( posy + world_render_distance_h / 2 );    local absCursorX = ( mapX * sx );  local absCursorY = ( mapY * sy );    local real_map_off_x = ( absCursorX - x );  local real_map_off_y = ( absCursorY - y );    -- Cursor outside of the map image?  if ( real_map_off_x < 0 ) or ( real_map_off_x >= w ) or ( real_map_off_y < 0 ) or ( real_map_off_y >= h ) then    return false;  end    local relative_map_off_x = ( real_map_off_x / w );  local relative_map_off_y = ( real_map_off_y / h );    local worldX = world_tl_start_x + relative_map_off_x * world_render_distance_w;  local worldY = world_tl_start_y - relative_map_off_y * world_render_distance_h;    return worldX, worldY;end

The clue was to calculate the size of the map that you draw inside the render target, then calculate the fraction of the width and height of how much you draw of the actual map image. So if you draw only a third of the map image, then you can expect the render to cover about 2000 game units. Then we can just linearly interpolate the world position with the relative cursor position on the map render. I noticed that your map does not render using same width and height thus I added further adjustments.

Have fun with the code! :) 

very nice! thank, i really am not able to do this calculation!?

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...