Jump to content

Get a random position in a given area


Dzsozi (h03)

Recommended Posts

I would like to have random spawnpoints inside a given area. I have the positions for minimum and maximum positions, but for some reason I can't manage to get the script working properly. I am using math.random from min to max values, but sometimes I get spawned outside the area, it doesn't return the right values. How can I get it working properly, so I spawn only inside the given area?

spawnPositions = {
	["Los Santos"] = {minPos = {1127.3712158203,-1632.8560791016}, maxPos = {1139.2634277344,-1621.2121582031}, z = 18.610622406006},
	["Las Venturas"] = {minPos = {1460.0589599609,2615.3452148438}, maxPos = {1478.0885009766,2622.806640625}, z = 10.8203125},
	["San Fierro"] = {minPos = {-2253.4848632813,521.00201416016}, maxPos = {-2250.8369140625,544.48956298828}, z = 35.174301147461},
	["Tierra Robada"] = {minPos = {-2259.4995117188,2352.9875488281}, maxPos = {-2253.8283691406,2372.5617675781}, z = 4.9140625},
	["Bone County"] = {minPos = {-244.1667175293,1210.9313964844}, maxPos = {-214.33074951172,1223.3796386719}, z = 19.735198974609},
	["Red County"] = {minPos = {243.48251342773,-160.65313720703}, maxPos = {252.89712524414,-151.75907897949}, z = 1.5703220367432},
	["Flint County"] = {minPos = {19.591306686401,-2641.8295898438}, maxPos = {37.629207611084,-2632.4833984375}, z = 40.432315826416},
	["Whetstone"] = {minPos = {-2122.837890625,-2481.69921875}, maxPos = {-2118.30859375,-2466.0988769531}, z = 30.625},
}
function getRandomSpawnPoint(cityName)
	if spawnPositions[cityName] then
		local realTime = getRealTime()
		math.randomseed(realTime.second + realTime.minute + realTime.hour)
		
		local minX, minY = spawnPositions[cityName].minPos[1], spawnPositions[cityName].minPos[2]
		local maxX, maxY = spawnPositions[cityName].maxPos[1], spawnPositions[cityName].maxPos[2]
		
		local x, y = math.random(minX, maxX), math.random(minY, maxY)
		return x, y
	end
end

I guess it is because of the negative values, how to do the calculations for math.random?

Link to comment
  • Moderators
-- Be a number #1
local value1 = 10
local value2 = 100

-- Be different! ;o
local difference = value1 - value2

-- Be positive! :D
local positiveDifference = math.abs(difference)

-- Be ra        ndo              m!
local randomPositiveDifference = math.random(positiveDifference)

local randomDifference
if difference < 0 then
  -- Be negative :(
  randomDifference = -randomPositiveDifference
else
  -- Stay positive! :DDDD
  randomDifference = randomPositiveDifference
end

-- Be famous
print(randomDifference)

 

Not sure if there is an easier way, but this is a way to calculate it.

 

Not understanding what the math.abs method/function does? Watch video: https://www.khanacademy.org/math/arithmetic/arith-review-negative-numbers/arith-review-abs-value/v/absolute-value-of-integers

Edited by IIYAMA
Link to comment

I am not sure how I should use this with my code. I tried many ways of adding, substracting and calculating but it always happened that I got spawned outside the given area coordinates. This is my current script:

spawnPositions = {
	["Whetstone"] = {minPos = {-188.8860168457,267.83926391602}, maxPos = {-204.15943908691,251.66763305664}, z = 12.078125},
}

function getRandomPositionInArea(minValue, maxValue)
	-- Be a number #1
	local value1 = minValue
	local value2 = maxValue

	-- Be different! ;o
	local difference = (value1 - value2)

	-- Be positive! :D
	local positiveDifference = math.abs(difference)

	-- Be ra        ndo              m!
	local randomPositiveDifference = math.random(positiveDifference)

	local randomDifference
	if difference < 0 then
	  -- Be negative :(
	  randomDifference = -randomPositiveDifference
	else
	  -- Stay positive! :DDDD
	  randomDifference = randomPositiveDifference
	end

	-- Be famous
	print(value1+(randomDifference-value1)+value2)
	return value1+(randomDifference-value1)+value2
end

function getRandomSpawnPoint(cityName)
	if spawnPositions[cityName] then
		
		local minX, minY = spawnPositions[cityName].minPos[1], spawnPositions[cityName].minPos[2]
		local maxX, maxY = spawnPositions[cityName].maxPos[1], spawnPositions[cityName].maxPos[2]
		
		local x, y = getRandomPositionInArea(minX, maxX), getRandomPositionInArea(minY, maxY)
		return x, y
	end
end

local cityName = "Whetstone"
local x, y = getRandomSpawnPoint(cityName)
setElementPosition(localPlayer, x, y, getGroundPosition(x, y, spawnPositions[cityName].z)+1)

 

Link to comment
function getRandomSpawnPoint(cityName)
	if spawnPositions[cityName] then
		local realTime = getRealTime()
		math.randomseed(realTime.second + realTime.minute + realTime.hour)
		
		local minX = math.min(spawnPositions[cityName].minPos[1], spawnPositions[cityName].maxPos[1])
		local minY = math.min(spawnPositions[cityName].minPos[2], spawnPositions[cityName].maxPos[2])
		local maxX = math.max(spawnPositions[cityName].minPos[1], spawnPositions[cityName].maxPos[1])
		local maxY = math.max(spawnPositions[cityName].minPos[2], spawnPositions[cityName].maxPos[2])

		return math.random(minX, maxX), math.random(minY, maxY)
	end
end

 

Link to comment
  • Moderators
54 minutes ago, Dzsozi (h03) said:

I am not sure how I should use this with my code. I tried many ways of adding, substracting and calculating but it always happened that I got spawned outside the given area coordinates. This is my current script:


spawnPositions = {
	["Whetstone"] = {minPos = {-188.8860168457,267.83926391602}, maxPos = {-204.15943908691,251.66763305664}, z = 12.078125},
}

function getRandomPositionInArea(minValue, maxValue)
	-- Be a number #1
	local value1 = minValue
	local value2 = maxValue

	-- Be different! ;o
	local difference = (value1 - value2)

	-- Be positive! :D
	local positiveDifference = math.abs(difference)

	-- Be ra        ndo              m!
	local randomPositiveDifference = math.random(positiveDifference)

	local randomDifference
	if difference < 0 then
	  -- Be negative :(
	  randomDifference = -randomPositiveDifference
	else
	  -- Stay positive! :DDDD
	  randomDifference = randomPositiveDifference
	end

	-- Be famous
	print(value1+(randomDifference-value1)+value2)
	return value1+(randomDifference-value1)+value2
end

function getRandomSpawnPoint(cityName)
	if spawnPositions[cityName] then
		
		local minX, minY = spawnPositions[cityName].minPos[1], spawnPositions[cityName].minPos[2]
		local maxX, maxY = spawnPositions[cityName].maxPos[1], spawnPositions[cityName].maxPos[2]
		
		local x, y = getRandomPositionInArea(minX, maxX), getRandomPositionInArea(minY, maxY)
		return x, y
	end
end

local cityName = "Whetstone"
local x, y = getRandomSpawnPoint(cityName)
setElementPosition(localPlayer, x, y, getGroundPosition(x, y, spawnPositions[cityName].z)+1)

 

function getRandomValueBetween (value1, value2)
    
    -- Be different! ;o
    local difference = value1 - value2
    
    -- Be positive! :D
    local positiveDifference = math.abs(difference)
    
    -- Be ra        ndo              m!
    local randomPositiveDifference = math.random(positiveDifference)
    
    local randomDifference
    if difference < 0 then
      -- Be negative :(
      randomDifference = -randomPositiveDifference
    else
      -- Stay positive! :DDDD
      randomDifference = randomPositiveDifference
    end
    return value1 - randomDifference
end
-- Be famous
print(getRandomValueBetween(-10, 10))

 

 

 

 

 

  • Like 1
Link to comment
  • Moderators
4 hours ago, Dzsozi (h03) said:

Thank you so much, it works!

The only thing you should be aware of is that you can't give it the same values.

 

if value1 == value2 then
 return value1
end

Something like this would solve that.

(Place it directly after line 1)

  • Thanks 1
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...