Mischief-1 Posted April 7 Share Posted April 7 Hi everyone. I have another problem; this time it is the map. I'd like to know how I could zoom in and have it follow the player. Plase see code below. local screenW,screenH = guiGetScreenSize() local middleX,middleY = screenW/2,screenH/2 local localPlayer = getLocalPlayer() local thisResource = getThisResource() local toggle = false local zoom = 0.95 local zoomRate = 0.1 local movementSpeed = 5 local minZoomLimit = 0.8 local maxZoomLimit = 5 local mapchat = false; local xOffset = 0 local yOffset = 0 local x,y = 0,0 local hSize,vSize = 0,0 local R,G,B,A = 255,255,255,175 local mapDrawColor = tocolor(R,G,B,A) local normalColor = tocolor(255,255,255,255) local mapFile = ":e_map/images/world.png" local topLeftWorldX,topLeftWorldY = -3000,3000 local lowerRightWorldX,lowerRightWorldY = 3000,-3000 local mapWidth,mapHeight = 6000,6000 local pixelsPerMeter = screenH/6000 local imageOwnerResource = getThisResource() toggleControl("radar",false) local abs=math.abs function calculateFirstCoordinates() -- This function is for making export functions work without the map having been opened once hSize=pixelsPerMeter*mapWidth*zoom vSize=pixelsPerMeter*mapHeight*zoom x=middleX-hSize/2+xOffset*zoom y=middleY-vSize/2+yOffset*zoom end addEventHandler("onClientResourceStart",getResourceRootElement(),calculateFirstCoordinates) function unloadImageOnOwnerResourceStop(resource) if resource==imageOwnerResource and resource~=thisResource then setPlayerMapImage() end end addEventHandler("onClientResourceStop",getRootElement(),unloadImageOnOwnerResourceStop) addEventHandler("onClientElementDataChange",localPlayer,function(data,oldvalue) if (data == "toolbelt1") then if getElementData(localPlayer,"toolbelt1") <= 0 then if triggerEvent("onClientPlayerMapHide",getRootElement(),false) then toggle=false if not isChatVisible() and mapchat then mapchat = false; showChat(true) end end end end end); function drawMap() if not toggle then dxDrawImage(0,0,0,0,mapFile,0,0,0,0,false) -- This is actually important, because otherwise you'd get huge lag when opening the maximap after a while (it seems to unload the image after a short while) else checkMovement() hSize=pixelsPerMeter*mapWidth*zoom vSize=pixelsPerMeter*mapHeight*zoom x=middleX-hSize/2+xOffset*zoom y=middleY-vSize/2+yOffset*zoom dxDrawImage(x,y,hSize,vSize,mapFile,0,0,0,mapDrawColor,false) drawRadarAreas() drawBlips() drawLocalPlayerArrow() drawGangPlayerArrow() end end addEventHandler("onClientPreRender",getRootElement(),drawMap) function drawRadarAreas() local radarareas=getElementsByType("radararea") if #radarareas>0 then local tick=abs(getTickCount()%1000-500) local aFactor=tick/500 for k,v in ipairs(radarareas) do local x,y=getElementPosition(v) local sx,sy=getRadarAreaSize(v) local r,g,b,a=getRadarAreaColor(v) local flashing=isRadarAreaFlashing(v) if flashing then a=a*aFactor end local hx1,hy1 = getMapFromWorldPosition(x,y+sy) local hx2,hy2 = getMapFromWorldPosition(x+sx,y) local width = hx2-hx1 local height = hy2-hy1 dxDrawRectangle(hx1,hy1,width,height,tocolor(r,g,b,a),false) end end end function drawBlips() for k,v in ipairs(getElementsByType("blip")) do if not getElementData(v,"DoNotDrawOnMaximap") then local icon=getBlipIcon(v) or 0 local size=(getBlipSize(v) or 2)*4 local r,g,b,a=getBlipColor(v) if icon~=0 then r,g,b=255,255,255 size=16 end local x,y,z=getElementPosition(v) x,y=getMapFromWorldPosition(x,y) local halfsize=size/2 if (icon == 2) then return; end dxDrawImage(x-halfsize,y-halfsize,size,size,"images/blips/"..icon..".png",0,0,0,tocolor(r,g,b,a),false) end end end function drawLocalPlayerArrow() local x,y,z=getElementPosition(localPlayer) local r=getPedRotation(localPlayer) local mapX,mapY=getMapFromWorldPosition(x,y) dxDrawImage(mapX-8,mapY-8,20,20,"images/blips/2.png",(-r)%360,0,0,tocolor(255,255,255,255),false) end function drawGangPlayerArrow() local gang = getElementData(localPlayer, "gang") or "None"; if (gang == "None") then return; end for i,v in ipairs(getElementsByType("player")) do if getElementData(v, "logedin") then if (getElementData(v, "gang") == gang and v ~= localPlayer and not getElementData(v, "isDead")) then local x,y,z=getElementPosition(v) local r=getPedRotation(v) local mapX,mapY=getMapFromWorldPosition(x,y) dxDrawImage(mapX-8,mapY-8,20,20,"images/blips/2.png",(-r)%360,0,0,tocolor(255,255,255,255),false) end end end end function zoomOutRecalculate() local newVSize=pixelsPerMeter*mapHeight*zoom if newVSize>screenH then local newY=middleY-newVSize/2+yOffset*zoom if newY>0 then yOffset=-(middleY-newVSize/2)/zoom elseif newY<=(-newVSize+screenH) then yOffset=(middleY-newVSize/2)/zoom end else yOffset=0 end local newHSize=pixelsPerMeter*mapWidth*zoom if newHSize>screenW then local newX=middleX-newHSize/2+xOffset*zoom if newX>=0 then xOffset=-(middleX-newHSize/2)/zoom elseif newX<=(-newHSize+screenW) then xOffset=(middleX-newHSize/2)/zoom end else xOffset=0 end end function checkMovement() -- Zoom if getPedControlState("radar_zoom_in") and zoom<maxZoomLimit then zoom=zoom+zoomRate if zoom>maxZoomLimit then zoom=maxZoomLimit end elseif getPedControlState("radar_zoom_out") and zoom>minZoomLimit then zoom=zoom-zoomRate if zoom<minZoomLimit then zoom=minZoomLimit end zoomOutRecalculate() end -- Move if getPedControlState("radar_move_north") then local newY=y-yOffset*zoom+(yOffset+movementSpeed)*zoom if newY<0 then yOffset=yOffset+movementSpeed end end if getPedControlState("radar_move_south") then local newY=y-yOffset*zoom+(yOffset-movementSpeed)*zoom if newY>(-vSize+screenH) then yOffset=yOffset-movementSpeed end end if getPedControlState("radar_move_west") then local newXOff=(xOffset+movementSpeed) local newX=x-xOffset*zoom+newXOff*zoom if newX<0 then xOffset=xOffset+movementSpeed end end if getPedControlState("radar_move_east") then local newX=x-xOffset*zoom+(xOffset-movementSpeed)*zoom if newX>(-hSize+screenW) then xOffset=xOffset-movementSpeed end end end addEvent("onClientPlayerMapHide") addEvent("onClientPlayerMapShow") function toggleMap() if getElementData(localPlayer,"toolbelt1") <= 0 then return; end if toggle then if triggerEvent("onClientPlayerMapHide",getRootElement(),false) then toggle=false if not isChatVisible() and mapchat then mapchat = false; showChat(true) end end else if triggerEvent("onClientPlayerMapShow",getRootElement(),false) then toggle=true if isChatVisible() then mapchat = true; showChat(false) end end end end bindKey("F11","up",toggleMap) bindKey("M","up",toggleMap) -- Export functions function getPlayerMapBoundingBox() return x,y,x+hSize,y+vSize end function setPlayerMapBoundingBox(startX,startY,endX,endY) if type(startX)=="number" and type(startY)=="number" and type(endX)=="number" and type(endY)=="number" then -- TODO return true end return false end function isPlayerMapVisible() return toggle end function setPlayerMapVisible(newToggle) if type(newToggle)=="boolean" then toggle=newToggle if toggle then triggerEvent("onClientPlayerMapShow",getRootElement(),true) else triggerEvent("onClientPlayerMapHide",getRootElement(),true) end return true end return false end function getMapFromWorldPosition(worldX,worldY) local mapX=x+pixelsPerMeter*(worldX-topLeftWorldX)*zoom local mapY=y+pixelsPerMeter*(topLeftWorldY-worldY)*zoom return mapX,mapY end function getWorldFromMapPosition(mapX,mapY) local worldX=topLeftWorldX+mapWidth/hSize*(mapX-x) local worldY=topLeftWorldY-mapHeight/vSize*(mapY-y) return worldX,worldY end function setPlayerMapImage(image,tLX,tLY,lRX,lRY) if image and type(image)=="string" and type(tLX)=="number" and type(tLY)=="number" and type(lRX)=="number" and type(lRY)=="number" then sourceResource = sourceResource or thisResource if string.find(image,":")~=1 then sourceResourceName = getResourceName(sourceResource) image = ":"..sourceResourceName.."/"..image end if dxDrawImage(0,0,0,0,image,0,0,0,0,false) then imageOwnerResource = sourceResource mapFile = image topLeftWorldX,topLeftWorldY = tLX,tLY lowerRightWorldX,lowerRightWorldY = lRX,lRY mapWidth,mapHeight = lRX-tLX,tLY-lRY pixelsPerMeter = math.min(screenW/(mapWidth),screenH/mapHeight) zoom = 1 xOffset = 0 yOffset = 0 return true end elseif not image then imageOwnerResource = thisResource mapFile = ":e_map/images/world.png" topLeftWorldX,topLeftWorldY = -3000,3000 lowerRightWorldX,lowerRightWorldY = 3000,-3000 mapWidth,mapHeight = 6000,6000 pixelsPerMeter = screenH/6000 zoom = 1 xOffset = 0 yOffset = 0 return true end return false end function getPlayerMapImage() return mapFile end function setPlayerMapColor(r,g,b,a) local color=tocolor(r,g,b,a) if color then mapDrawColor = color R,G,B,A = r,g,b,a return true end return false end function setPlayerMapMovementSpeed(s) if type(s)=="number" then movementSpeed=s return true end return false end function getPlayerMapMovementSpeed() return movementSpeed end function getPlayerMapZoomFactor() return zoom end function getPlayerMapZoomRate() return zoomRate end function getBlipShowingOnMaximap(blip) if isElement(blip) and getElementType(blip)=="blip" then return not getElementData(blip,"DoNotDrawOnMaximap") end return false end function setBlipShowingOnMaximap(blip,toggle) if isElement(blip) and getElementType(blip)=="blip" and type(toggle)=="boolean" then return setElementData(blip,"DoNotDrawOnMaximap",not toggle,false) end return false end function setPlayerMapZoomFactor(z) if type(z)=="number" then if z>=minZoomLimit and z<=maxZoomLimit then local prevZoom=zoom zoom=z if z<prevZoom then zoomOutRecalculate() end return true end end return false end function setPlayerMapZoomRate(z) if type(z)=="number" then zoomRate=z return true end return false end function setPlayerMapMinZoomLimit(l) if type(l)=="number" then minZoomLimit=l return true end return false end function setPlayerMapMaxZoomLimit(l) if type(l)=="number" then maxZoomLimit=l return true end return false end function getPlayerMapMinZoomLimit() return minZoomLimit end function getPlayerMapMaxZoomLimit() return maxZoomLimit end function getPlayerMapColor() return R,G,B,A end Added a picture on how it is in game and how I visualize it would be. Please see below. your guidance and help would be really appreciated https://imgur.com/a/FygOgoa Link to comment
Mischief-1 Posted April 7 Author Share Posted April 7 This is a slight modification from maximap byGamesnert Link to comment
Mischief-1 Posted April 18 Author Share Posted April 18 please close this thread. thanks! Link to comment
Moderators Vinyard Posted April 18 Moderators Share Posted April 18 6 hours ago, Mischief-1 said: please close this thread. thanks! Closing this on request. Link to comment
Recommended Posts